函數響應式領域建模
作 者: (美)Debasish Ghosh(德巴斯什·戈施) 著 李源 譯
定 價: 79
出?版?社: 電子工業出版社
出版日期: 2018年01月01日
頁 數: 296
裝 幀: 簡裝
ISBN: 9787121323928
●1. 函數式領域建模:介紹.............................................................. 1 1.1 什麼是領域模型 .............................................................................................. 2 1.2 領域驅動設計介紹 .......................................................................................... 4 1.2.1 邊界上下文 .......................................................................................... 4 1.2.2 領素 ...................................................................................... 5 1.2.3 領域對像的生命周期 .......................................................................... 8 1.2.4 通用語言 ............................................................................................ 13 1.3 函數化思想 .................................................................................................... 14 1.3.1 哈,純粹的樂趣 ................................................................................ 17 1.3.2 純函數組合 ........................................................................................ 21 1.4 管理副作用 .................................................................................................... 26 1.5 素的優點 ........................................................................................ 28 1.6 響應式領域模型 ............................................................................................ 31 1.6.1 響應式模型的3+1 視圖 .................................................................... 31 1.6.2 揭穿“我的模型不能失敗”的神話 ................................................ 32 1.6.3 伸縮性與消息驅動 ............................................................................ 34 1.7 事件驅動編程 ................................................................................................ 35 1.7.1 事件與命令 ........................................................................................ 37 1.7.2 領域事件 ............................................................................................ 38 1.8 函數式遇上響應式 ........................................................................................ 40 1.9 總結 ................................................................................................................ 41 2 Scala 與函數式領域模型..........................................................42 2.1 為什麼是Scala ............................................................................................... 43 2.2 靜態類型與富領域模型 ................................................................................ 45 2.3 領域行為的純函數 ........................................................................................ 47 2.3.1 回顧抽像的純粹性 ............................................................................ 50 2.3.2 引用透明的其他好處 ........................................................................ 53 2.4 代數數據類型與不變性 ................................................................................ 53 2.4.1 基礎:和類型與乘積類型 ................................................................ 53 2.4.2 模型中的ADT 結構數據 .................................................................. 56 2.4.3 ADT 與模式匹配 ............................................................................... 56 2.4.4 ADT 鼓勵不變性 ............................................................................... 58 2.5 局部用函數,全局用OO.............................................................................. 59 2.5.1 Scala 中的模塊 .................................................................................. 60 2.6 用Scala 使模型具備響應性 .......................................................................... 64 2.6.1 管理作用 ............................................................................................ 65 2.6.2 管理失敗 ............................................................................................ 65 2.6.3 管理延遲 ............................................................................................ 67 2.7 總結 ................................................................................................................ 69 3 設計函數式領域模型...............................................................70 3.1 API 設計的代數 ............................................................................................. 71 3.1.1 為什麼是代數方法 ............................................................................ 72 3.2 為領域服務定義代數 .................................................................................... 72 3.2.1 賦值抽像 ............................................................................................ 73 3.2.2 組合抽像 ............................................................................................ 74 3.2.3 類型的最終代數 ................................................................................ 76 3.2.4 代數法則 ............................................................................................ 77 3.2.5 代數解釋程序 .................................................................................... 79 3.3 領域模型生命周期中的模式 ........................................................................ 80 3.3.1 工廠――對像從何處來..................................................................... 82 3.3.2 智能構造器 ........................................................................................ 82 3.3.3 通過更有表現力的類型進一步提升智能 ........................................ 84 3.3.4 用代數數據類型聚合 ........................................................................ 86 3.3.5 用透鏡更新聚合功能 ........................................................................ 88 3.3.6 倉儲與解耦的永恆藝術 .................................................................... 94 3.3.7 高效地使用生命周期模式――結論............................................... 101 3.4 總結 .............................................................................................................. 102 4 領域模型的函數式模式.......................................................... 103 4.1 模式――代數、函數、類型的聚合 ........................................................... 104 4.1.1 領域模型中的挖掘模式 .................................................................. 106 4.1.2 用函數式模式使領域模型參數化 .................................................. 107 4.2 強類型函數式編程中計算的基本模式 ...................................................... 112 4.2.1 函子――建立模式........................................................................... 112 4.2.2 加強版函子模式 .............................................................................. 114 4.2.3 單子作用――applicative 模式的變體 ............................................ 121 4.3 如何用模式對領域模型進行塑形 .............................................................. 130 4.4 用代數、類型和模式演進API ................................................................... 134 4.4.1 代數――稿............................................................................... 136 4.4.2 改進代數 .......................................................................................... 137 4.4.3 最終組合――采用類型................................................................... 138 4.5 用模式和類型增強領域的不變性 .............................................................. 139 4.5.1 貸款處理模型 .................................................................................. 139 4.5.2 使非法狀態不可表示 ...................................................................... 141 4.6 總結 .............................................................................................................. 142 5 領域模型的模塊化................................................................ 144 5.1 將領域模型模塊化 .......................................................................................... 145 5.2 模塊化的領域模型――案例學習 ............................................................... 146 5.2.1 模塊的解剖 ...................................................................................... 147 5.2.2 模塊的構成 ...................................................................................... 154 5.2.3 模塊的物理組織 .............................................................................. 155 5.2.4 模塊鼓勵組合 .................................................................................. 156 5.2.5 領域模型中的模塊化――結論....................................................... 157 5.3 類型類模式――模塊化的多態行為 ........................................................... 157 5.4 邊界上下文的聚合模塊 .............................................................................. 160 5.4.1 模塊與邊界上下文 .......................................................................... 161 5.4.2 邊界上下文間的通信 ...................................................................... 162 5.5 模塊化的另一個模式――free monad ......................................................... 163 5.5.1 賬戶存儲 .......................................................................................... 163 5.5.2 使它免費 .......................................................................................... 165 5.5.3 賬戶存儲――free monad ................................................................ 167 5.5.4 free monad 解釋程序 ....................................................................... 169 5.5.5 free monad――重點回顧 ................................................................ 172 5.6 總結 .............................................................................................................. 173 6 響應式模型.......................................................................... 174 6.1 響應式領域模型 .......................................................................................... 175 6.2 使用future 的非阻塞API 設計 .................................................................. 177 6.2.1 異步作為堆疊作用 .......................................................................... 178 6.2.2 基於monad 轉換器的實現 ............................................................. 181 6.2.3 用並行存取降低延遲――一種響應式模式 .................................. 183 6.2.4 使用scalaz.concurrent.Task 作為響應式構造 ................................ 187 6.3 明確的異步消息傳遞 .................................................................................. 189 6.4 流模式 .......................................................................................................... 191 6.4.1 一個案例 .......................................................................................... 191 6.4.2 領域管道圖 ...................................................................................... 195 6.4.3 後端壓力處理 .................................................................................. 197 6.5 actor 模型 ..................................................................................................... 198 6.5.1 領域模型與actor ............................................................................. 199 6.6 總結 .............................................................................................................. 203 7 響應式流建模....................................................................... 205 7.1 響應式流模型 .............................................................................................. 206 7.2 何時使用流模型 .......................................................................................... 207 7.3 領域用例 ...................................................................................................... 208 7.4 基於流的領域交互 ...................................................................................... 208 7.5 實現:前臺 .................................................................................................. 210 7.6 實現:後臺 .................................................................................................. 211 7.7 流模型的主要結論 ...................................................................................... 214 7.8 使模型具有彈性 .......................................................................................... 215 7.8.1 使用Akka Streams 監管 .................................................................. 216 7.8.2 冗餘集群 .......................................................................................... 217 7.8.3 數據的持久化 .................................................................................. 217 7.9 基於流的領域模型與響應式原則 .............................................................. 219 7.10 總結 ............................................................................................................ 220 8 響應式持久化與事件溯源...................................................... 221 8.1 領域模型的持久化 ...................................................................................... 222 8.2 關注點分離 .................................................................................................. 224 8.2.1 持久化的讀/ 寫模型 ....................................................................... 225 8.2.2 命令查詢責任分離 .......................................................................... 226 8.3 事件溯源 ..................................................................................................... 228 8.3.1 事件溯源領域模型中的命令和事件 .............................................. 229 8.3.2 實現CQRS 和事件溯源 .................................................................. 231 8.4 實現事件溯源的領域模型(函數式) ........................................................ 232 8.4.1 作為頭等實體的事件 ...................................................................... 233 8.4.2 命令是事件上的free monad .......................................................... 235 8.4.3 解釋程序――隱藏所有有趣的東西............................................... 237 8.4.4 投影――讀取端模型....................................................................... 242 8.4.5 事件存儲 .......................................................................................... 243 8.4.6 分布式CQRS――一個短信 ........................................................... 243 8.4.7 實現的總結 ...................................................................................... 244 8.5 其他持久化模型 .......................................................................................... 245 8.5.1 將聚合作為ADT 映射到關繫型表 ................................................ 245 8.5.2 操作數據(函數式) ........................................................................ 247 8.5.3 到Akka Streams 管道的響應式獲取 .............................................. 248 8.6 總結 .............................................................................................................. 249 9 測試領域模型...................................................................... 250 9.1 測試領域模型概述 .............................................................................................. 251 9.2 設計可測試的領域模型 .............................................................................. 252 9.2.1 解耦副作用 ...................................................................................... 253 9.2.2 為領域函數提供自定義解釋程序 .................................................. 254 9.2.3 實現參數化與測試 .......................................................................... 255 9.3 基於xUnit 的測試 ....................................................................................... 256 9.4 回顧模型的代數 .......................................................................................... 257 9.5 基於屬性的測試 .......................................................................................... 258 9.5.1 建模屬性 .......................................................................................... 258 9.5.2 驗證領域模型中的屬性 .................................................................. 259 9.5.3 數據生成器 ...................................................................................... 264 9.5.4 是否比基於xUnit 的測試更好 ....................................................... 266 9.6 總結 .............................................................................................................. 267 10 核心思想與原則................................................................ 268 10.1 回顧 ............................................................................................................ 268 10.2 函數式領域建模的核心原則 .................................................................... 269 10.2.1 表達式思想 .................................................................................... 269 10.2.2 早抽像, 晚賦值 ............................................................................. 270 10.2.3 使用合適的抽像 ............................................................................ 270 10.2.4 發布要做什麼,在組合器中隱藏如何做 .................................... 270 10.2.5 從實現中解耦代數 ........................................................................ 271 10.2.6 隔離邊界上下文 ............................................................................ 271 10.2.7 偏向future 而不是actor ................................................................ 271 10.3 展望未來 .................................................................................................... 272
內容簡介
傳統的分布式應用不會切入微服務、快速數據及傳感器網絡的響應式世界。為了捕獲這些應用的動態聯繫及依賴,我們需要使用另外一種方式來進行領域建模。由純函數構成的領域模型是以一種更加自然的方式來反映一個響應式繫統內的處理流程,同時它也直接映射到了相應的技術和模式,比如Akka、CQRS 以及事件溯源。本書講述了響應式繫統中建立領域模型所需要的通用且可重用的技巧――首先介紹了函數式編程和響應式架構的相關概念,然後逐步地在領域建模中引入這些新的方法,同時本書提供了大量的案例,當在項目中應用這些概念時,可作為參考。
(美)Debasish Ghosh(德巴斯什·戈施) 著 李源 譯
Debasish Ghosh,軟件架構師,是使用Scala和Akka進行響應式設計的先行者。他同時也是DSLs in Action一書的作者,該書由Manning出版社於2010年出版。
李源,曾在華為技術有限公司工作8 年,經歷過開發、SE、PM和PQA等多個崗位,目前在途牛旅遊網擔任研發總經理一職,是美國質量協會(ASQ)注冊質量工程師(CQE);譯者有豐富的開發、架構設計及研發管理經驗,先後負責過多個大型項目的方案設計和繫統規劃,對於C++、Java 以及設計模式等領域都有比較深入的研究;曾翻譯《Java 性能調優指南》......
"