函數式編程

What

Functional Programming(函數式編程)在概念上和Object Oriented Programming(面向對象編程), Procedural Programming(過程化編程)相似, 是一種編程範式。
與OOP以對象爲中心的理念不一樣,FP將全部計算機的操做視爲函數運算,函數是操做的基本單位。函數擁有和基本類型同樣的地位,能夠將一個變量賦值爲函數(First class -- 一等公民),能夠在函數的參數中傳遞函數(higher-order function -- 高階函數)javascript

Why

  1. 學習一點新的編程範式能夠有效防止老年癡呆。
  2. 真的頗有趣
  3. 相比於過程化、面向對象,函數式書寫的代碼更易讀,更簡短。
  4. 由於函數式編程是無反作用(side effects)的,不須要考慮死鎖問題,適合併發編程,所以在雲計算領域獲得了普遍應用(Scala)

How

好了,進入正題
如下示例代碼均爲JavaScriptjava

1. 反作用--Side Effects

先來看兩段代碼程序員

//代碼片斷1 let minium = 20; const checkAge = (age)=> age >= minium; 
//代碼片斷2 let number = 2; const multipleNumber = (n) => { number = number * n; return number; } 

這兩段代碼有問題嗎?
一般狀況下,代碼片斷1並不會發生什麼問題, 咱們傳入年齡,而且判斷是否是大於20歲。編程

但若是有人修改了minium呢?此時判斷的條件改變了,致使咱們的結果也會改變。當咱們第二次運行checkAge(22)的時候,可能返回的並非第一次運行的結果。api

對於checkAge這個函數來講,它須要觀測的值不只有入參age,還有一個全局變量minium,它的運行結果依賴系統狀態,這對於程序員來講是十分痛苦的。併發

而代碼片斷2就很容易發現問題了,這個函數修改了一個全局變量,換言之,它修改了系統狀態,當第二次輸入相同參數的時候你會獲得一個不同的結果。ide

不,這太讓人難過了,這不是咱們想要的,咱們但願咱們的函數足夠純淨,相同的輸入永遠獲得相同的輸出。並且,不要作多餘的事:
偷偷在console裏打一個log
偷偷給某個api發送一個request
偷偷修改本地文件系統函數式編程

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息