Functional Programming 系列(一)- 命令式編程 | 聲明式編程
Published in
Nov 23, 2020
前言
安安大家!看到標題應該就知道接下來的文章會是一系列關於 FP 的編程思想,所以想先來解釋一下為什麼會想做這個主題。
大概有下列幾點原因:
- 本身主要是使用 Vue 開發的,最近想要升上 Vue 3,而 Vue 3 的 Composition Api 可以寫得很 Functional,因此想借這個機會學習。
- 覺得 FP 很有趣,也覺得把程式碎片化有利於維護性以及延展性。
- 希望可以濃縮我從各個地方學習下來的知識,幫助到也想學習 FP 的人。
大概就以上幾點原因,差不多了!我們就開始吧!!
一開始想先來聊聊
命令式編程 ( Imperative ) && 聲明式編程 ( Declarative )
#命令式编程
注重的是 ( How ),我必須告訴機器,你應該要怎麼做!!才能達到我要的目的。
舉個家事例來說:
:「請幫我把拖把弄濕、擰乾、之後再把頭放在地板掃一圈」
😀
😐
😮
沒錯!!你必須一步一步告訴他應該怎麼做!!
他不知道你的目的是什麼,只知道你想要他這樣做。
#聲明式編程
注重的是 ( What ),我只需要告訴機器我想要什麼!!我才不管你怎麼去執行呢 😤 ( 倔強起來
以剛剛同樣的家事例來說:
:「請 幫 我 拖 地 !!」
對!就是這麼簡單,我不需要知道你的過程,反正幫我把事情做好就對了。
從上述例子看起來應該可以很明顯的感受到
「聲明式編程」總是比「命令式編程」更簡潔明瞭一點
如果上述例子還不太能理解的話,我們直接來看程式碼的例子
試著思考一下,下面這段程式碼是要做什麼呢?
OK!
再來我們繼續看下面的例子:
發現了嗎?這兩個例子 都是在取得大於 3 而且是偶數的數字
一模一樣的事,程式碼長度足足差了「 5 倍」!!(先不考慮實作 filter 背後的邏輯
綜觀以上例子,我舉出幾點比較明顯的缺點
命令式編程:
- 過程中可能會需要很多臨時變量,account、accounts、accountArr… 等,英文就已經不好了,還要花一堆時間想那些單字!!
- 沒辦法一眼理解這些程式碼要做什麼
- 今天要過濾的條件式有 n 個(需要產 3 個陣列,一個大於 3、一個小於 5 、一個偶數),程式碼長度會是 n 倍
- 如果要加新需求,可能會破壞原本的程式碼,例如我過濾完的陣列,還必須全部+1
聲明式編程:
- 非作者會不知道該函式或方法是如何實現的,不過我相信很多人到現在還是不知道這個 filter 是怎麼實現的,但還是完成了很多案子而且過得好好的 😆
- 沒有經驗的人會寫出一堆 function 。假設今天 Array 的原型沒有 filter 這個方法,我相信一定會跑出很多 filterOdd、filterEven、filterBetterThan這種東西,因為沒有 High Order Function 的概念(已經親眼見識過了XD
以我個人來說,我是比較偏好聲明式編程的
以上是我這次分享的內容,我覺得去理解這種「編程思想」或者說「設計模式」蠻有趣的,如果我有說錯的地方,或是有人想與我討論,歡迎留言給我哦!