常見的編程範式有以下幾種:
functional programming(函數式編程)
imperative programming(命令式編程)
Objective-Oriented programming(物件導向式編程)
procedure programming(程序式編程)
Functional Programming
Functional programming 沒有只是構想,沒有絕對的規定。視程式設計為數學函式,每個函式各自獨立,彼此互不影響,
只要每個各自獨立的函式是正確的,那麼整個程式就是正確的。
各程式語言實作不同,但是有共通點:
- No Side Effect-在表示式(Expression)內不可以造成值的改變。
- First-Class Function-函數被當作一般值,可當傳入參數、傳出結果。
- 資料放在堆疊stack-或由堆疊指向heap。
- 盡量避免[狀態]與[可變資料],一切與函式內部無關。
優點
- Unit test 相對容易。以函式為單位,且只檢查輸入、輸出是否正確,不管其他狀態。
- 好除錯,因為沒有外部變數影響,所以錯誤容易重現,好找。
- 因為可以保留函式內狀態(closure)所以程式可以精簡。
- 適合寫併發(Concurrency)程式,因為不共享記憶體、沒執行緒、不上鎖、不擔心Critical Section。
Functional Programming到底做了什麼?
- Higher-Order Functions-可接受函式當參數,或以函式為回傳值的函式,稱為 higher-order function,容易進行資料處理(排序、過濾、對應)。
- Currying-用currying方式,定義特殊化函式。例如,有個函數為power(x, y),會計算出x的y次方,那麼事先將參數y指定為2,就可以定義一個平方函數square(x)。
- Lazy Evaluation-表示式可拖到真正需要執行才執行,因此編譯器有更大的優化空間。
- Continuations-將一個函數的傳出值,傳進另一個函數當作傳入值,也可以產生循序執行的效果。
- Pattern Matching-模式比對的方式,可以讓系統自動幫我們進行分支與變數的指定。降低switch/case依賴、多型依賴。
- Closure-函式離開後,其context依然保留,保留在內部函式,可當傳出值。
- List processing-有好用的list處理函式。
- Meta-Programming-許多FP語言都提供方便的Meta-Programming工具,讓你可以設計自己的Domain specific language
Imperative Programming(命令式編程)
Imperativ programming 認為程式的執行,就是一連串狀態的改變。資料大量放在heap中。利用大量的流程控制,或狀態判斷還選擇執行的程式。
例如switch/case就是最好的例子。
沒有留言:
張貼留言