如何學習 Functional Programming ?

栏目: 编程语言 · 发布时间: 5年前

内容简介: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原理与研发实践

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原理与研发实践》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

MD5 加密
MD5 加密

MD5 加密工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器