内容简介:Functional Programming 在近年來逐漸受到重視,尤其 ECMAScript 本身就具有 Functional 特質 (First-Class Function、Closure、Higher Order Function),再加上 React、Redux、RxJS、Ramda … 等推波助瀾,FP 從理論走向實務,但也由於 FP 與 OOP 思維迥異,因此很多人視 FP 為異端而裹足不前,本文整理出 FP 三個最重要的心法幫助大家學習。FP 的一個特色就是FP 的本質有三項:
Functional Programming 在近年來逐漸受到重視,尤其 ECMAScript 本身就具有 Functional 特質 (First-Class Function、Closure、Higher Order Function),再加上 React、Redux、RxJS、Ramda … 等推波助瀾,FP 從理論走向實務,但也由於 FP 與 OOP 思維迥異,因此很多人視 FP 為異端而裹足不前,本文整理出 FP 三個最重要的心法幫助大家學習。
Functional Programming
FP 的一個特色就是 專有名詞
很多,如 Currying、Partial Application、Functor、Monad … 等,光搞懂一個名詞就要花很多時間,但這些性質其實都是從 FP 三個最基本特性所推導出來的,也就是要學好 FP,應該先從最基本觀念建立起,然後再逐步向外推展學習其他衍生特性。
FP 的本質有三項:
- 資料與功能分離
- No Side Effect
- Function Composition
資料與功能分離
傳統 OOP 教我們 資料
與 功能
合一,以 職責
的角度,將 資料
與 功能
封裝在合適的 class 內,在實務上很容易遇到以下問題:
- 由於資料與功能合一,但功能不斷增加,很容易單一 class 就有太多的功能,但由於這些功能又與該資料有關,放在其他 class 又不太適合
- 若不同資料有相同的功能,放在哪一個 class 都很尷尬
FP 則是強調 資料
與 功能
分離:
-
資料
僅以 array 與 object literal 表示,不另外建立型別 -
功能
僅以 function 表示,可自行將 function 放在適合的 module,與資料
無關
也由於 FP 的 資料
與 功能
分離:
- 功能不斷增加,只要不斷新增 function,再重構到適合的 module 即可,因此沒有單一 class 爆炸問題
- 由於 function 與 module 與 data 是獨立的,因此容易重複使用,也不會有該功能該放在哪一個 class 的尷尬
No Side Effect
傳統 OOP 的最小顆粒是 class,class 對外而言是封裝,但 class 對內則沒有,因此 class 內部的 method 是以 this
去讀取與修改 field,在實務上很容易遇到以下問題:
- class 並不見得由同一個人寫,也就是由團隊不同人維護不同 method,因此要維護 method 時,必須很清楚 field 的來龍去脈,因為 bug 通常就是來自於其他 method 修改了 field
- 由於需求的改變,功能不斷的增加,單一 class 很容易 method 過多而爆炸,因此會想要重構到新的 class,但由於各 method 共用 field 盤根錯節,要重構到其他 class 並不容易
- 有些 method 並沒有回傳值,他的目的只是修改 field,但這些 field 可能根本沒有 getter,造成 unit test 困難
FP 的 function 都是 Pure Function,也就是 function 只跟參數有關,且一定要有回傳值:
- 儘管一個 module 由團隊不同人維護不同 function,但因為 function 只跟參數有關,只要搞懂該 function 即可,也不用擔心被其他 function 影響
- 當單一 module 的 fuction 過多時,只要建立新的 module,再將 function 剪下貼上即可,不用擔心共用 field 問題,非常容易重構
- Pure Function 只跟參數有關,又一定有回傳值,因此 unit test 非常容易,只要提供參數的 stub,並且驗證結果即可
Function Composition
程式碼只要寫大,就會有重複程式碼的問題要解決,傳統 OOP 使用的是 繼承
,這會造成 子類別
與 父類別
的 強耦合
,父類別所新增的 method 會讓子類別強迫概括承受。
後來 OOP 建議使用 Class Composition,也就是將重複的部分抽成 class,使用 DI 注入,在實務上很容易遇到以下問題:
- 為了讓 class 能單一職責,我們會希望 class 顆粒盡量小,但這又會造成 DI 注入爆炸
- 若要將 class 單一職責到極致,常常會看到一個 class / interface 只有一個 method,造成檔案數目爆炸
FP 則是使用 Function Composition,將重複部分抽成小小的 function,再以 Higher Order Function 組合成所要的 function:
- Function 的顆粒遠比 class 小,徹底實踐單一職責,重複使用率超高
- 不會造成 DI 爆炸,只是 import 很多而已,但 import 很多也沒什麼關係
- 不會再有一個 class / interface 只有一個 method 的窘境,檔案數目大幅減少
對於常用的 Higher Order Function,如 RxJS、Ramda 已經提供了很多,我們只需寫與商業邏輯相關的小 function,然後組合 library 所提供的 function 即可
Conclusion
- 初學者在學習 FP 時,只要時時想到這三點,要求自己這樣寫程式,FP 功力就會慢慢進步
- 儘管某些 framework 還是使用 OOP 設計,但盡量將這三點融合在 OOP 內,也能使程式碼更容易維護
- FP 的關鍵在於 Function Composition,因此熟悉 RxJS 或 Ramda 的 operator 是必要的
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Web Services原理与研发实践
顾宁刘家茂柴晓路 / 机械工业出版社 / 2006-1 / 33.00元
本书以web services技术原理为主线,详细解释、分析包括XML、XML Schema、SOAP、WSDL、UDDI等在内在的web Services核心技术。在分析、阐述技术原理的同时,结合作者在Web Services领域的最新研究成果,使用大量的实例帮助读者深刻理解技术的设计思路与原则。全书共有9章,第1章主要介绍web Services的背景知识;第2-7章着重讲解webServic......一起来看看 《Web Services原理与研发实践》 这本书的介绍吧!