函式程式設計基本原理介紹
經過很長一段時間的學習和物件導向程式設計的工作,我退後一步思考系統的複雜性。
“複雜性是任何使軟體難以理解或修改的東西” - 約翰奧特豪特
做了一些研究以後,我發現了函數語言程式設計概念,如不變性和純函式。這些概念是構建無副作用功能的巨大優勢,因此維護系統更容易 - 還有其他一些好處。
純粹的函式
當我們想要理解函數語言程式設計時,我們學到的第一個基本概念是純函式。但這究竟意味著什麼?是什麼讓一個函式純潔?這是一個非常嚴格的純度定義:
- 如果給出相同的引數,它返回相同的結果(也稱為deterministic確定性)
- 它不會引起任何可觀察到的副作用
如果你的函式中使用了全域性物件則為不純;如果我們的函式讀取外部檔案,它不是純函式 - 檔案的內容可以更改;任何依賴於隨機數生成器的函式都不可能是純粹的。
每個函式都是孤立的,無法影響我們系統的其他部分。純函式是穩定,一致和可預測的。給定相同的引數,純函式將始終返回相同的結果。是否會發生相同的引數具有不同的結果?我們不需要考慮這種情況 - 因為它永遠不會發生。
純函式的好處
程式碼肯定更容易測試。我們不需要模仿任何東西。所以我們可以用不同的上下文單元測試純函式:
- 給定引數A→期望函式返回值B
- 給定引數C→期望函式返回值D
不變性: 隨著時間的推移不變或無法改變。當資料不可變時,其在建立後就不能被更改。如果要更改不可變物件,使用新值重新建立一個新物件。
引用透明:純函式+不可變資料=引用透明。基本上,如果函式對於相同的輸入始終產生相同的結果,則它是引用透明的。
其他
使用懶惰載入,保持不變性,實現函式組合,禁止空物件,禁止丟擲異常等等。
相關文章
- stoi函式介紹函式
- NIO程式設計介紹程式設計
- Java中函數語言程式設計Monad概念介紹Java函數程式設計
- 函式程式設計函式程式設計
- python入門,程式設計基礎概念介紹(變數,條件,函式,迴圈)Python程式設計變數函式
- oracle常用函式介紹Oracle函式
- funclib函式庫介紹函式
- cuda函式庫介紹函式
- Shell程式設計 --- Shell介紹程式設計
- javascript函式中with的介紹JavaScript函式
- Dart建構函式介紹Dart函式
- Linux中Libevent程式設計介紹Linux程式設計
- Python多工程式設計介紹Python程式設計
- Linux系統程式設計之程式介紹Linux程式設計
- select函式socket程式設計函式程式設計
- JS 命令式 宣告式 函式式 程式設計?JS函式程式設計
- shell程式設計–bash變數介紹程式設計變數
- 快速介紹幾個JS函式JS函式
- ES6 Generator 函式介紹函式
- 原創:oracle聚合函式介紹Oracle函式
- javascript中generator函式的介紹JavaScript函式
- javascript高階函式的介紹JavaScript函式
- 函數語言程式設計-鏈式程式設計RAC函數程式設計
- 不用任何賦值的程式設計稱為*函式式*程式設計賦值程式設計函式
- 揚帆起航:從指令式程式設計到函式響應式程式設計程式設計函式
- Bash程式設計007——函式(一)程式設計函式
- 函式響應式程式設計與RxSwift函式程式設計Swift
- python函式程式設計 返回函式 匿名函式 裝飾器 偏函式Python函式程式設計
- 簡單介紹JS函式防抖和函式節流JS函式
- 設計模式:介紹設計模式
- 《響應式程式設計(Reactive Programming)介紹》文章總結與案例分析程式設計React
- Erlang/Elixir 中的 OTP 程式設計介紹程式設計
- 005 Rust 非同步程式設計,Pin 介紹Rust非同步程式設計
- 011 Rust 網路程式設計,gRPC 介紹Rust程式設計RPC
- 006 Rust 非同步程式設計,Stream 介紹Rust非同步程式設計
- 017 Rust 網路程式設計,TFTP 介紹Rust程式設計FTP
- 015 Rust 網路程式設計,FTP 介紹Rust程式設計FTP
- 013 Rust 網路程式設計,SMTP 介紹Rust程式設計