函式程式設計基本原理介紹

banq發表於2018-11-18

經過很長一段時間的學習和物件導向程式設計的工作,我退後一步思考系統的複雜性。

“複雜性是任何使軟體難以理解或修改的東西” - 約翰奧特豪特

做了一些研究以後,我發現了函數語言程式設計概念,如不變性和純函式。這些概念是構建無副作用功能的巨大優勢,因此維護系統更容易 - 還有其他一些好處



純粹的函式
當我們想要理解函數語言程式設計時,我們學到的第一個基本概念是純函式。但這究竟意味著什麼?是什麼讓一個函式純潔?這是一個非常嚴格的純度定義:

  • 如果給出相同的引數,它返回相同的結果(也稱為deterministic確定性)
  • 它不會引起任何可觀察到的副作用

如果你的函式中使用了全域性物件則為不純;如果我們的函式讀取外部檔案,它不是純函式 - 檔案的內容可以更改;任何依賴於隨機數生成器的函式都不可能是純粹的。

每個函式都是孤立的,無法影響我們系統的其他部分。純函式是穩定,一致和可預測的。給定相同的引數,純函式將始終返回相同的結果。是否會發生相同的引數具有不同的結果?我們不需要考慮這種情況 - 因為它永遠不會發生。

純函式的好處
程式碼肯定更容易測試。我們不需要模仿任何東西。所以我們可以用不同的上下文單元測試純函式:

  • 給定引數A→期望函式返回值B
  • 給定引數C→期望函式返回值D


不變性: 隨著時間的推移不變或無法改變。當資料不可變時,其在建立後就不能被更改。如果要更改不可變物件,使用新值重新建立一個新物件。

引用透明:純函式+不可變資料=引用透明。基本上,如果函式對於相同的輸入始終產生相同的結果,則它是引用透明的。

其他
使用懶惰載入,保持不變性,實現函式組合,禁止空物件,禁止丟擲異常等等。
 

相關文章