Edward Garson
為什麼要學函數式程式設計#
函數式程式設計(Functional Programming)近年重新受到主流社群的關注。原因之一是函數式範式的**湧現特性(emergent properties)**非常適合應對多核心處理的挑戰。但這篇文章要傳達的重點不僅於此——真正的關鍵是:你應該深入理解函數式程式設計。
掌握函數式範式能大幅提升你在其他語境中撰寫程式碼的品質。深入理解並應用函數式範式,你的設計將展現出更高程度的引用透明性(referential transparency)。
引用透明性的價值#
引用透明性是一個非常理想的特性:函數在給定相同輸入時,無論在何處、何時被呼叫,都會回傳相同的結果。也就是說,函數的求值不依賴(甚至完全不依賴)可變狀態的副作用。
命令式程式碼中的缺陷,主要原因可歸咎於可變變數(mutable variables)。每個開發者都曾經歷過「某個值不如預期」的調查過程。
如何在實務中應用#
- 減少可變性:透過審慎的測試驅動設計(TDD),特別是遵循「Mock Roles, not Objects」的原則,可以消除不必要的可變性
- 責任分配更佳:使用更多小型函數,以傳入的參數操作,而非引用可變的成員變數
- 更少的缺陷:因為更容易追蹤錯誤值的來源
- 更易除錯:不需要推斷哪個特定的上下文導致了錯誤的賦值
這種方法並非在所有情境下都是最佳選擇。例如在物件導向系統中,領域模型開發(Domain Model Development)中的協作模式往往比使用者介面開發更適合這種風格。
函數式與物件導向的互補#
掌握函數式範式後,你能明智地將這些觀念應用到其他領域。你的物件系統會與其函數式對應物產生更多共鳴。事實上,有些人甚至主張:在各自的巔峰狀態,函數式程式設計與物件導向不過是彼此的倒影——計算世界中的陰與陽。