天天看點

《函數響應式領域模組化》讀後感

  不得不說這是一本好書。本書涉及的主要内容從書名就可以看出來:函數式、響應式、領域驅動模組化。

  該書并不是一個入門級教材,讀者需要對函數式、響應式、領域驅動模組化有一定的基礎,缺一不可。比如我對領域驅動模組化這塊不是太熟悉,研讀的時候會不太了解作者為什麼會舉那些例子;對函數式不夠深入,看後面幾章就會有雲裡霧裡的感覺;對響應式不清楚,就不會明白作者費那麼大的勁舉的例子解決了一個什麼問題。簡單點來說,讀此書需要把函數式、響應式、領域模組化相關知識補充一下。正如AKKA創始人說的那樣,“如果内心不夠強大,那麼這本書将不适合你,閱讀它很費勁”。

  幸運的是,你看到了這篇部落格,作者會在下面的篇幅中簡單的介紹函數式、響應式、領域驅動模組化的基本概念及其解決的問題,這樣你讀此書的時候就不會像作者那麼吃力了。

  1. 函數式程式設計

  維基百科對函數式程式設計的解釋:在計算機科學裡,函數式程式設計是一種程式設計範式,它将計算描述為表達式求值并避免了狀态和資料改變。函數式程式設計幾個重要的特性:純函數無副作用、不變的資料、高階函數、流計算模式、尾遞歸、柯裡化等。函數式程式設計中的“函數”可以簡單的了解成數學中的函數。學過高等數學的都知道,函數一般定義為:y=f(x),很明顯它有幾個特點:有至少一個輸入,至少一個輸出,輸入相同時輸出相同。

  純函數無副作用是指從業務領域角度來看,函數值僅僅取決于輸入(及内部變量),計算過程中沒有副作用産生,函數執行多次和執行一次對業務領域産生的作用相同。副作用是指除了傳回函數值以外的其他結果,例如修改全局變量。純函數既不依賴外部的狀态也不修改外部的狀态。

  不變的資料是指變量的值是不可變的。比如指令式程式設計時,定義一個整型變量x,可以多次指派動作,例如執行x=1,x=2,x=3,x=4一系列操作之後,x最終值是4。而函數式程式設計中,變量一旦指派,則不允許修改。這一點跟高等數學中的代數很像,估計對于數學家來說,1和2是兩個不同的變量,是不可以把1和2互相指派的。

  高階函數就是函數的函數。簡單點來說就是,輸入是一個函數,輸出也是一個函數。在數學中它們也叫做算子(運算符)或泛函。函數是對自變量的映射,高階函數是對函數的映射。

  流計算模式其實就是pipeline,使用它可以讓代碼具有申明式的語義化、子產品化,更加富有表現力。例如下段代碼:

getStock()
  .filter(quote => quote.price > 80)
  .map(quote => quote.price)
  .foreach(price => console.log(`Prices higher than $30: ${price}`));
      

  尾遞歸就是函數尾部調用自身。既然函數程式設計中變量不可變,那怎麼實作循環呢,畢竟循環需要有一個計數器的,函數式語言裡面隻能用遞歸來解決疊代問題。但遞歸會造成棧溢出的問題,那麼尾遞歸可以解決這個問題,編譯器會在編譯期間會将尾遞歸優化為循環,進而解決棧溢出的問題。

  柯裡化就是一個函數在參數沒給全時傳回另一個函數,傳回的函數的參數正好是餘下的參數。curry化最大的意義在于把多個參數的function等價轉化成多個單參數function的級聯,這樣所有的函數就都統一了,友善做lambda演算。 在scala裡,curry化對類型推演也有幫助,scala的類型推演是局部的,在同一個參數清單中後面的參數不能借助前面的參數類型進行推演,curry化以後,放在兩個參數清單裡,後面一個參數清單裡的參數可以借助前面一個參數清單裡的參數類型進行推演。這就是為什麼 foldLeft這種函數的定義都是curry的形。

  關于函數式程式設計可參考

什麼是函數式程式設計思維 

響應式程式設計

  響應式程式設計更像是一種設計思想或者設計目标。響應式程式設計的目标通常是程式或應用具有響應能力:可相應的、彈性、伸縮性、消息驅動。彈性是面對失敗的相應;伸縮性是在不同負載情況下的響應;消息驅動是指松耦合性,通過異步消息隔離上下文。響應式程式設計最重要的思想就是圍繞失敗來做設計,并提升模型的綜合彈性。按照我的了解響應式模型一定是有響應的,不管是正常的還是異常的,當然這一點仁者見仁智者見智。響應式程式設計是一種關于資料流和變化傳播的聲明式程式設計範例,簡單點來說就是程式對異步事件進行相應的處理。

  關于響應式程式設計可參考

那些年我們錯過的響應式程式設計

領域驅動模組化

  領域驅動設計(DDD)是一種軟體設計思想,是在軟體開發時對現實世界進行抽象并映射到軟體系統的方法論。這在設計大型軟體或系統時非常重要的設計方法,當然了,如果你隻是寫一個排序函數就沒必要這麼大費周章了。由于作者對DDD不太熟悉,隻能談一下個人的簡單感受:DDD是一套軟體設計方法論,它采用實體、值對象、子產品、聚合、工廠、倉庫等基本概念指導如何對現實世界中的業務進行模組化。

  對于DDD可參考

淺析DDD(領域驅動設計)

繼續閱讀