爲何要使用函數式編程?

最近看了gitbook上面一本函數式編程的書。忽然間對函數式編程有了更加深刻的理解。並且前一陣子使用HRFrame第二版開發公司的項目的時候遇到一些本質性的問題。其實早就想開發第三版本了。可是無奈沒有什麼新的思路,所以第三版的開發遲遲沒有開始。並且我以爲HRFrame從初版到第二版只能說是更加簡潔,核心思想並無什麼變化,若是再寫一版,我我的是以爲沒有什麼意義。違背了我當初開發HRFrame的初衷。看過了書,有了對編程新的認識,第三版的開發工做正式開始。javascript

爲何要使用函數式編程?

個人朋友都知道我是javascript,函數式腦,emacs「腦殘粉」,在公司中多年前就推崇你們編寫函數式代碼。奈何當時水平不夠,函數式究竟是啥都不知道,只是隱隱以爲函數式代碼量少,可讀性高。關注了幾年,找了好多相關資料去學習,感受如今終於入門了。那麼爲何要使用函數式編程。我舉一個例子來講明這個問題。html

一個用戶管理的功能,通常狀況下數據表中保存用戶的出生日期,當讀取的時候根據當前日期計算用戶年齡。假設後臺給的數據結構以下

{data:[
    {id:1,name:'張三',birthday:'1984-01-04'},
    {id:1,name:'張三',birthday:'1984-01-04'},
    {id:1,name:'張三',birthday:'1984-01-04'},
    ......
]}

此時,若是咱們要在前端顯示用戶的年齡,大概代碼會這樣編寫。前端

var dateNow = new Date();
for(var i=0;i<data.length;i++){
    var date1 = new Date(data[i].birthday);
    data[i].age=dateNow.getYear()-date1.getYear();
}
//實例代碼你們不要糾結是否能正常執行

以上的代碼是我隨着寫這篇文章隨手寫出來的。我想說的並非代碼寫的怎麼樣,而是要分析一下寫這些代碼的時候個人腦子在想什麼。咱們閱讀的時候是順序閱讀的。所以從上到下,我看到了以下的重點。java

  1. 數據表中保存的時候用戶的生日。
  2. 根據用戶的生日計算用戶的年齡
  3. 數據表結構中有一個數組
  4. 數組中每一項是用戶信息
  5. 用戶信息中birthday是用戶的生日

ok,我看到了所有的重點,多年的編程經驗告訴我,這是處理數組,遍歷每個元素,取出生日,計算年齡。 首先我先敲一個for循環,固然還有for in更合適。而後我知道我能夠取出每個元素及生日,我要作的是用今年的年份減去生日的年份,ok我打開chrome的調試窗口,測試了一下計算方法。如圖python

輸入圖片說明 ok了,我知道了如何使用Date對象進行年齡的計算,如今我把這些實驗性質的代碼放回到循環中。功能就算完成了。 好吧,這裏要注意了,編寫代碼的時候,咱們的大腦是什麼樣的順序在輸出代碼?git

  1. 循環
  2. 取數
  3. 轉換格式
  4. 計算

發現了麼,咱們提取重點的順序和大腦生產代碼的順序是反着的。OMG。這說明什麼問題?咱們編碼時須要記住全部的重點之後才能順利寫出來代碼,就像作高考語文題同樣,咱們看了文章,文章最末尾問,本文的中心思想是什麼?因而咱們又從頭讀一遍,歸納一下,寫出來。並且這種題目我是很不會作的。golang

所以,咱們從當初學編程的時候,老師就告訴咱們,註釋是多麼重要,必定要寫註釋。由於註釋實際上就是對代碼重點的描述。ajax

var dateNow = new Date();//獲取當前時間
for(var i=0;i<data.length;i++){//遍歷用戶數據
    var date1 = new Date(data[i].birthday);//轉換生日成爲時間對象
    data[i].age=dateNow.getYear()-date1.getYear();//當前年份-生日年份=年齡
}

這個例子還只是很基本很簡單的例子,若是再加上UI,ajax更加實際的狀況。這些代碼寫完了大概三個小時之後絕對會忘記裏面一些關鍵的代碼是如何執行的。chrome

所以,不少人學不會編程,以爲寫代碼很累。真的很累,這仍是寫沒有架構的代碼,若是再加上設計,各類工廠,抽象類。項目後期客戶需求一變更,OMG...頭髮....編程

說道這裏,是否是函數式編程就是解決這些問題的銀彈呢? no,no,no. 我只是在抱怨開發過程當中坑是怎麼產生的,我才無論怎麼解決這些問題呢。從c語言開始,到java,.Net到python,ruby到golang等等編程語言都在試圖解決這些問題。coding less,make more~

我喜歡解決方案的是,把老虎關在籠子裏。 哪裏產生bug,哪裏產生不清晰,就把哪裏封裝起來。這一點,不管是函數式編程仍是命令式編程,不管面向過程仍是面向對象,全部編程風格都在訴說這個事情。那麼爲何要學習函數式編程? 很簡單的緣由,解決問題的手段不嫌多啊~多一種手段,多一個視角。

javascirpt是最好的編程語言。沒有之一。

未完待續...

我看的那本書: https://llh911001.gitbooks.io/mostly-adequate-guide-chinese/content/ch1.html (出於對本書做者及譯者尊敬,擔憂本身才疏學淺誤人子弟,文章中不少例子直接採用書中的例子。)

相關文章
相關標籤/搜索