用“資料與演算法”解釋DDD“上下文和聚合”
資料 vs 演算法 = 上下文 vs. 聚合
從對應位置來看:
- “資料”=“上下文”
- “演算法”= “聚合”
資料=上下文
首先,資料本身是上下文的一種體現,如果你熟悉寫作文,那麼作文要求你說明來龍去脈,上下文背景需要交待清楚,那麼這些文字本身就是一種資料,一個領域中大量相關資料堆積在一起就能說明某種場景的上下文背景。
當然,這裡上下文是有限制的、有邊界的,也就是說:資料不是無限多,資料也是有限的,有一定意義的,比如圍繞購物車發生的資料是發生在購物的上下文中;而下訂單上下文中發生的資料則是圍繞即將生成的訂單進行的,比如需要填入收貨地址,選擇優惠碼或湊單等等。
理解以上概念以後,事件建模或事件溯源EventSourcing概念就容易理解:
在上下文中發生的資料是一種“事件”。
也就是說:事件也是一種資料,只不過是發生的動作或活動的資料,把動詞“事件”對映成名詞“資料”,事件建模就是追蹤一個需求流程中這些動作或活動,然後定義起止範圍,也就是作用域,這段作用域就類似有界上下文BC,例如購物車上下文的起止作用域;下單上下文的起止作用域範圍,這樣我們就得到兩個上下文:購物車上下文和下單上下文。
那麼,關鍵就是界定上下文的開始與最後的作用域範圍,也就是起點和終點,如果把事件資料看成是“點”,那麼“點”串起來的就是“線”或“流stream”或“流程”,這就是上下文的作用域範圍,就是有界的上下文BC。
一段線總是有兩個端點,正如染色體兩端有兩個端粒影響人的壽命一樣,上下文界限對整體DDD設計也非常重要。
如果你一開始無法界定上下文這段範圍,或者可能隨著時間邊界會動態變化,那麼採取事件溯源先把一段或可能包含幾段線的資料“點”儲存起來,以後再從中發現演算法或聚合。
演算法=聚合
演算法本身代表一種聚合的意思,例如:X+Y 是加法,是將兩個元素相加在一起的演算法,那麼,這裡演算法本身體現了高凝聚的特點,如果說有界上下文BC是一種截斷耦合實現鬆耦合的方法,那麼演算法或聚合是實現高凝聚的方式。
資料占主導地位。如果你選擇了正確的資料結構並很好地組織了事情,演算法幾乎總是不言而喻的。資料結構(而不是演算法)才是程式設計的核心。
也就是說,當你界定好上下文資料以後,演算法會自然湧現emerge,演算法取決於你希望從這段上下文資料獲得什麼樣的洞察力和預見性,比如你想按照某個欄位合併或排序,那麼使用簡單SQL語句就可以實現,一條SQL語句本身就是一個聚合,否則怎麼會成為“語句呢”?這裡我們又碰到程式設計中的“作用域 vs. 語句”,
作用域=上下文;語句=聚合。
總結
看來處處都存在“上下文 vs. 聚合”,只要你多一個心眼,從這個新視角再重新看世界,你會發現世界果然是由這兩種元素組成,正所謂“陰與陽”一樣,上下文是藏在暗處的“陰”,而聚合是聚光燈下的“陽”。
原來二分法不只是“物質 vs. 意識”這樣的二分方式,還有“上下文 vs. 聚合”、“資料 vs. 演算法”、“作用域 vs . 語句”、“陰 vs. 陽”、“隱性 vs. 顯性”、“有效期 vs. 產品”、“劑量 vs. 藥品”等二分方式,這些方式是不是更實用?更具有可操作性?而且會糾正我們的認知偏見呢?
相關文章
- DDD之4聚合和聚合根
- DDD中限界上下文與通用語言的作用
- DDD聚合設計原則
- DDD中聚合、聚合根的含義以及作用
- DDD和OO的重要區別:上下文重於抽象抽象
- DDD的實體、值物件、聚合根的基類和介面:設計與實現物件
- DDD聚合五種設計方法
- 使用Spring Data JDBC實現DDD聚合SpringJDBC
- DDD聚合的數學模型 -Thomas Ploch模型
- DDD聚合:樂觀併發 -James Hickey
- DDD | 04-什麼是聚合根
- 【資料結構與演算法】字首和與差分資料結構演算法
- 資料結構與演算法-圖解版資料結構演算法圖解
- 資料和行為與有界上下文、微服務的關係 - Alberto Brandolini微服務
- ES資料聚合
- DDD中BoundedContext視為有限上下文更好Context
- 【資料結構和演算法】Trie樹簡介及應用詳解資料結構演算法
- python演算法與資料結構-演算法和資料結構介紹(31)Python演算法資料結構
- 用Python解決資料結構與演算法問題(三):線性資料結構之棧Python資料結構演算法
- DDD設計工具:上下文對映器ContextMapperContextAPP
- DDD理論學習系列(3)-- 限界上下文
- 資料結構和演算法的圖解和實現資料結構演算法圖解
- DDD與資料事務指令碼指令碼
- 用資料結構解釋事件溯源 – {4Comprehension}資料結構事件
- DDD/HexArch提示與技巧:使用ComponentScan將領域繫結到Spring上下文 - beyondxscratchSpring
- IT名企演算法與資料結構題目最優解--棧和佇列演算法資料結構佇列
- Java資料結構與演算法--遞迴和回溯Java資料結構演算法遞迴
- 《資料結構與演算法》——表、棧和佇列資料結構演算法佇列
- 圖解Javascript上下文與作用域圖解JavaScript
- 『資料結構與演算法』棧:詳解與程式碼實現資料結構演算法
- SQL Server資料庫————模糊查詢和聚合函式SQLServer資料庫函式
- DDD聚合:一致性邊界 -James Hickey
- 從零開始學資料結構和演算法(三)棧與棧的應用資料結構演算法
- DDD與Repository
- Elasticsearch 系列(五)- 資料聚合Elasticsearch
- mongoDB資料庫之聚合MongoDB資料庫
- 資料探勘之KMeans演算法應用與簡單理解演算法
- 阿里可解釋性推薦演算法應用阿里演算法