DDD和OO的重要區別:上下文重於抽象

banq發表於2021-06-16
DDD領域驅動設計與OO物件導向之間是有區別的,物件導向更注重抽象,從差異中尋找共同點,然後將其抽象出來;而DDD更注重上下文邊界,這種邊界代表區分差異。其實這是兩種不同的思維方式。
女性系統思想家瑪麗·凱瑟琳·貝特森的系統觀點摘錄一文中認為,聖經的舊約是教會人們學習區分差異,而新約則是教人們注重聯絡,區別與聯絡是兩種不同的思維模型,正主導西方科學發展的不同路徑,在區分細分領域,我們細分到量子力學,但是在注重聯絡關係方向,跨學科的系統科學也正在不斷髮展。
OO物件導向思想是:首先需要找到Object(當然,中文初學者還是對Object理解有些障礙),從眾多物件object找到它們的共性,物以類聚,抽象成類Class。大多數人還停留在這個初期的抽象階段,養成了逢事喜歡總結抽象的思維習慣,這造成了很多程式碼都有糟糕的抽象,這加劇了許多人認為抽象本質上是糟糕的感性情緒,甚至認為抽象=過度設計!
而DDD給我們帶來了一種完全不同的思路方向,首先應該注重區別,哪怕存在很多重複也在所不惜,不要輕易抽象總結為類class,因為上下文為王
DDD子域與有界上下文的關係一文中,有的一個領域裡面可能存在20個有界/限界上下文,看到這麼多上下文中重複現象,習慣OO抽象思維的你是否有一種合併它們的衝動呢?
有界上下文的發展是嚴格按照業務實踐的樣子去劃分的,正確的上下文邊界遵循業務的輪廓。不同的區域在不同的時間以不同的速度變化,將概念壓縮到單個模型中是有限制和前提條件的,這個前提條件就是:你得先讀舊約:事物的區分,然後再讀新約:發現區分後的事物之間的聯絡。
當然banq個人認為還有第三步:找出這些聯絡中的動態相互作用,它們應該包含一種邏輯一致性,這就是聚合,聚合是將同一上下文內區分後的不同實體合併在一起,合併的依據是他們的當前上下文中湧現Emergence的特徵邏輯,注意,這裡抽象的依據不是依靠這些實體內部共性,而是因為它們參與了整體系統的湧現。
尋找“先分後合”的抽象方法有很多,例如先允許大量重複程式碼(因為位於不同上下文中),然後透過重構刪除繼承關係,刪除沒有使用過的重複項,然後在相關的地方找到新的抽象。有的人提出使用強制的函式式風格和無狀態函式來消除重複,其實函數語言程式設計提出的無狀態、不變性、純度等也都是一種抽象,所以,即使你掌握足夠好的 Haskell,人們也很容易地在 FP 語言中提出糟糕的抽象:幽默:程式設計師耍小聰明導致認知負擔 
總之,在DDD中,上下文的邊界重於對這些上下文中共同特徵的抽象,是最底層邏輯,上下文重要性高於抽象,寧可不抽象,都不能不劃分上下文邊界,因為在科學認識論中:必須先有上下文的區分,才有可能實現抽象,而且抽象的依據最好是依據動態相互作用關係,而不是靜態的資料庫外來鍵關聯關係。
Boundary > Abastract !


 

相關文章