Functional Programming 系列(一)- 命令式編程 | 聲明式編程

00如是說
Coding Fighter
Published in
Nov 23, 2020
Photo by James Harrison on Unsplash

前言

安安大家!看到標題應該就知道接下來的文章會是一系列關於 FP 的編程思想,所以想先來解釋一下為什麼會想做這個主題。

大概有下列幾點原因:

  1. 本身主要是使用 Vue 開發的,最近想要升上 Vue 3,而 Vue 3 的 Composition Api 可以寫得很 Functional,因此想借這個機會學習。
  2. 覺得 FP 很有趣,也覺得把程式碎片化有利於維護性以及延展性。
  3. 希望可以濃縮我從各個地方學習下來的知識,幫助到也想學習 FP 的人。

大概就以上幾點原因,差不多了!我們就開始吧!!

一開始想先來聊聊

命令式編程 ( Imperative ) && 聲明式編程 ( Declarative )

#命令式编程

注重的是 ( How ),我必須告訴機器,你應該要怎麼做!!才能達到我要的目的。

舉個家事例來說:

:「請幫我把拖把弄濕、擰乾、之後再把頭放在地板掃一圈」

😀

😐

😮

Photo by Volodymyr Hryshchenko on Unsplash

沒錯!!你必須一步一步告訴他應該怎麼做!!

他不知道你的目的是什麼,只知道你想要他這樣做。

#聲明式編程

注重的是 ( What ),我只需要告訴機器我想要什麼!!我才不管你怎麼去執行呢 😤 ( 倔強起來

以剛剛同樣的家事例來說:

:「請 幫 我 拖 地 !!」

對!就是這麼簡單,我不需要知道你的過程,反正幫我把事情做好就對了。

從上述例子看起來應該可以很明顯的感受到

「聲明式編程」總是比「命令式編程」更簡潔明瞭一點

如果上述例子還不太能理解的話,我們直接來看程式碼的例子

試著思考一下,下面這段程式碼是要做什麼呢?

OK!

再來我們繼續看下面的例子:

發現了嗎?這兩個例子 都是在取得大於 3 而且是偶數的數字

一模一樣的事,程式碼長度足足差了「 5 倍」!!(先不考慮實作 filter 背後的邏輯

綜觀以上例子,我舉出幾點比較明顯的缺點

命令式編程:

  1. 過程中可能會需要很多臨時變量,account、accounts、accountArr… 等,英文就已經不好了,還要花一堆時間想那些單字!!
  2. 沒辦法一眼理解這些程式碼要做什麼
  3. 今天要過濾的條件式有 n 個(需要產 3 個陣列,一個大於 3、一個小於 5 、一個偶數),程式碼長度會是 n 倍
  4. 如果要加新需求,可能會破壞原本的程式碼,例如我過濾完的陣列,還必須全部+1

聲明式編程:

  1. 非作者會不知道該函式或方法是如何實現的,不過我相信很多人到現在還是不知道這個 filter 是怎麼實現的,但還是完成了很多案子而且過得好好的 😆
  2. 沒有經驗的人會寫出一堆 function 。假設今天 Array 的原型沒有 filter 這個方法,我相信一定會跑出很多 filterOdd、filterEven、filterBetterThan這種東西,因為沒有 High Order Function 的概念(已經親眼見識過了XD

以我個人來說,我是比較偏好聲明式編程

以上是我這次分享的內容,我覺得去理解這種「編程思想」或者說「設計模式」蠻有趣的,如果我有說錯的地方,或是有人想與我討論,歡迎留言給我哦!

--

--