Edward Garson

為什麼要學函數式程式設計#

函數式程式設計(Functional Programming)近年重新受到主流社群的關注。原因之一是函數式範式的**湧現特性(emergent properties)**非常適合應對多核心處理的挑戰。但這篇文章要傳達的重點不僅於此——真正的關鍵是:你應該深入理解函數式程式設計

掌握函數式範式能大幅提升你在其他語境中撰寫程式碼的品質。深入理解並應用函數式範式,你的設計將展現出更高程度的引用透明性(referential transparency)

引用透明性的價值#

引用透明性是一個非常理想的特性:函數在給定相同輸入時,無論在何處、何時被呼叫,都會回傳相同的結果。也就是說,函數的求值不依賴(甚至完全不依賴)可變狀態的副作用

命令式程式碼中的缺陷,主要原因可歸咎於可變變數(mutable variables)。每個開發者都曾經歷過「某個值不如預期」的調查過程。

如何在實務中應用#

  • 減少可變性:透過審慎的測試驅動設計(TDD),特別是遵循「Mock Roles, not Objects」的原則,可以消除不必要的可變性
  • 責任分配更佳:使用更多小型函數,以傳入的參數操作,而非引用可變的成員變數
  • 更少的缺陷:因為更容易追蹤錯誤值的來源
  • 更易除錯:不需要推斷哪個特定的上下文導致了錯誤的賦值

這種方法並非在所有情境下都是最佳選擇。例如在物件導向系統中,領域模型開發(Domain Model Development)中的協作模式往往比使用者介面開發更適合這種風格。

函數式與物件導向的互補#

掌握函數式範式後,你能明智地將這些觀念應用到其他領域。你的物件系統會與其函數式對應物產生更多共鳴。事實上,有些人甚至主張:在各自的巔峰狀態,函數式程式設計與物件導向不過是彼此的倒影——計算世界中的陰與陽。