DDD和OO的重要區別:上下文重於抽象
DDD領域驅動設計與OO物件導向之間是有區別的,物件導向更注重抽象,從差異中尋找共同點,然後將其抽象出來;而DDD更注重上下文邊界,這種邊界代表區分差異。其實這是兩種不同的思維方式。
在女性系統思想家瑪麗·凱瑟琳·貝特森的系統觀點摘錄一文中認為,聖經的舊約是教會人們學習區分差異,而新約則是教人們注重聯絡,區別與聯絡是兩種不同的思維模型,正主導西方科學發展的不同路徑,在區分細分領域,我們細分到量子力學,但是在注重聯絡關係方向,跨學科的系統科學也正在不斷髮展。
OO物件導向思想是:首先需要找到Object(當然,中文初學者還是對Object理解有些障礙),從眾多物件object找到它們的共性,物以類聚,抽象成類Class。大多數人還停留在這個初期的抽象階段,養成了逢事喜歡總結抽象的思維習慣,這造成了很多程式碼都有糟糕的抽象,這加劇了許多人認為抽象本質上是糟糕的感性情緒,甚至認為抽象=過度設計!
而DDD給我們帶來了一種完全不同的思路方向,首先應該注重區別,哪怕存在很多重複也在所不惜,不要輕易抽象總結為類class,因為上下文為王!
在DDD子域與有界上下文的關係一文中,有的一個領域裡面可能存在20個有界/限界上下文,看到這麼多上下文中重複現象,習慣OO抽象思維的你是否有一種合併它們的衝動呢?
有界上下文的發展是嚴格按照業務實踐的樣子去劃分的,正確的上下文邊界遵循業務的輪廓。不同的區域在不同的時間以不同的速度變化,將概念壓縮到單個模型中是有限制和前提條件的,這個前提條件就是:你得先讀舊約:事物的區分,然後再讀新約:發現區分後的事物之間的聯絡。
當然banq個人認為還有第三步:找出這些聯絡中的動態相互作用,它們應該包含一種邏輯一致性,這就是聚合,聚合是將同一上下文內區分後的不同實體合併在一起,合併的依據是他們的當前上下文中湧現Emergence的特徵邏輯,注意,這裡抽象的依據不是依靠這些實體內部共性,而是因為它們參與了整體系統的湧現。
尋找“先分後合”的抽象方法有很多,例如先允許大量重複程式碼(因為位於不同上下文中),然後透過重構刪除繼承關係,刪除沒有使用過的重複項,然後在相關的地方找到新的抽象。有的人提出使用強制的函式式風格和無狀態函式來消除重複,其實函數語言程式設計提出的無狀態、不變性、純度等也都是一種抽象,所以,即使你掌握足夠好的 Haskell,人們也很容易地在 FP 語言中提出糟糕的抽象:幽默:程式設計師耍小聰明導致認知負擔
總之,在DDD中,上下文的邊界重於對這些上下文中共同特徵的抽象,是最底層邏輯,上下文重要性高於抽象,寧可不抽象,都不能不劃分上下文邊界,因為在科學認識論中:必須先有上下文的區分,才有可能實現抽象,而且抽象的依據最好是依據動態相互作用關係,而不是靜態的資料庫外來鍵關聯關係。
Boundary > Abastract !
在女性系統思想家瑪麗·凱瑟琳·貝特森的系統觀點摘錄一文中認為,聖經的舊約是教會人們學習區分差異,而新約則是教人們注重聯絡,區別與聯絡是兩種不同的思維模型,正主導西方科學發展的不同路徑,在區分細分領域,我們細分到量子力學,但是在注重聯絡關係方向,跨學科的系統科學也正在不斷髮展。
OO物件導向思想是:首先需要找到Object(當然,中文初學者還是對Object理解有些障礙),從眾多物件object找到它們的共性,物以類聚,抽象成類Class。大多數人還停留在這個初期的抽象階段,養成了逢事喜歡總結抽象的思維習慣,這造成了很多程式碼都有糟糕的抽象,這加劇了許多人認為抽象本質上是糟糕的感性情緒,甚至認為抽象=過度設計!
而DDD給我們帶來了一種完全不同的思路方向,首先應該注重區別,哪怕存在很多重複也在所不惜,不要輕易抽象總結為類class,因為上下文為王!
在DDD子域與有界上下文的關係一文中,有的一個領域裡面可能存在20個有界/限界上下文,看到這麼多上下文中重複現象,習慣OO抽象思維的你是否有一種合併它們的衝動呢?
有界上下文的發展是嚴格按照業務實踐的樣子去劃分的,正確的上下文邊界遵循業務的輪廓。不同的區域在不同的時間以不同的速度變化,將概念壓縮到單個模型中是有限制和前提條件的,這個前提條件就是:你得先讀舊約:事物的區分,然後再讀新約:發現區分後的事物之間的聯絡。
當然banq個人認為還有第三步:找出這些聯絡中的動態相互作用,它們應該包含一種邏輯一致性,這就是聚合,聚合是將同一上下文內區分後的不同實體合併在一起,合併的依據是他們的當前上下文中湧現Emergence的特徵邏輯,注意,這裡抽象的依據不是依靠這些實體內部共性,而是因為它們參與了整體系統的湧現。
尋找“先分後合”的抽象方法有很多,例如先允許大量重複程式碼(因為位於不同上下文中),然後透過重構刪除繼承關係,刪除沒有使用過的重複項,然後在相關的地方找到新的抽象。有的人提出使用強制的函式式風格和無狀態函式來消除重複,其實函數語言程式設計提出的無狀態、不變性、純度等也都是一種抽象,所以,即使你掌握足夠好的 Haskell,人們也很容易地在 FP 語言中提出糟糕的抽象:幽默:程式設計師耍小聰明導致認知負擔
總之,在DDD中,上下文的邊界重於對這些上下文中共同特徵的抽象,是最底層邏輯,上下文重要性高於抽象,寧可不抽象,都不能不劃分上下文邊界,因為在科學認識論中:必須先有上下文的區分,才有可能實現抽象,而且抽象的依據最好是依據動態相互作用關係,而不是靜態的資料庫外來鍵關聯關係。
Boundary > Abastract !
相關文章
- 介面和抽象類的區別抽象
- java-介面和抽象類的聯絡和區別。Java抽象
- Java中抽象類和介面的區別Java抽象
- 方法重置和重寫的區別
- 過載和重寫的區別
- 工廠模式和抽象工廠的區別是什麼?模式抽象
- GET 和 POST 的區別(重要,面試常問)面試
- Java 8 中的抽象類和介面到底有啥區別?Java抽象
- 【Java基本功】聊聊抽象類和介面的區別Java抽象
- 10.int和Integer的區別(重點)
- Java 介面和抽象類是什麼,有什麼區別Java抽象
- 【抽象那些事】不完整的抽象&多方面抽象&未用的抽象&重複的抽象抽象
- 關於gcc、make和CMake的區別GC
- 運維和開發知識,Java中的抽象類和介面的兩大區別!運維Java抽象
- Java和HTML有什麼區別?哪個更重要?JavaHTML
- Java中抽象類與介面的區別Java抽象
- Java中抽象類和介面的介紹及二者間的區別Java抽象
- JavaScript執行上下文和作用域是什麼及區別JavaScript
- 關於stable_sort()和sort()的區別:
- 關於java的引用和c++的區別JavaC++
- 用“資料與演算法”解釋DDD“上下文和聚合”演算法
- DDD中限界上下文與通用語言的作用
- 耦合與聚合的區別比單體與微服務區別更重要微服務
- ../和./和/的區別
- LinkedList和ArrayList的區別、Vector和ArrayList的區別
- http和https的區別/get和post的區別HTTP
- 淺談C#中重寫和隱藏的區別C#
- DDD中BoundedContext視為有限上下文更好Context
- 關於PHP this 和 self 呼叫類方法的區別PHP
- know和know about的區別 基於coca corpus
- ||和??的區別
- /*和/**的區別
- 重建模與重構的區別
- 關於DDD和COLA的一些總結和思考
- 關於mysql設定varchar 欄位的預設值''和null的區別,以及varchar和char的區別MySqlNull
- sqlserver索引重建和索引重組的區別和操作方法SQLServer索引
- Mysql RC/RR隔離原理和區別 不可重複讀和可重複讀MySql
- Java:面試題:抽象類與介面的區別Java面試題抽象