原文:
危險的ddd聚合根
ddd的核心是聚合。這沒有問題,大家都認同。但關於ddd中的聚合方式,其實我還是有些擔心,下面說說我的想法,希望大家參與討論。
其實當初第一次看到ddd中關於聚合根部分論述的時候,就感覺有些僵化。ddd中的聚合根的分析設計思路大致是這樣:1、業務本質邏輯分析;2、確認聚合物件間的組成關係;3、所有的讀寫必須沿著這些固有的路徑進行。
這是一種靜態聚合的設計思路。理論上講,似乎沒有什麼問題。但實際上,人對第一步中的業務邏輯分析就是乙個漸進的過程,不是穩定不變的。不是誰都可以成為業務領域專家,就算是業務領域專家也不一定都是對的。在我看來,從時間維度和多使用者場景下看,這種靜態的聚合分析設計方法是根本無法保證領域模型的穩定性。
也許有人不理解,那可以打個比喻:過去幾個孩子可以和爸爸媽媽高高興興地一家人生活在一起,但是孩子們長大後是必然要分家的。其實我只是在強調,人們對業務過程的認識是有侷限性的,誰也無法避免。
ddd本來就是處理複雜業務邏輯設計問題。我看到大家用ddd去分析一些小專案的時候,往往為誰是聚合根而無法達成共識。這說明每個人對業務認識的角度、深度和廣度都不同,自然得出的聚合根也不同。試想,這樣的情況下,領域模型怎麼保持穩定。
更現實的解決方式是怎麼在動態過程中盡可能地保證業務領域模型的穩定性。在我看來:物件之間是平等的,沒有誰高人一等(也就是沒有聚合根);場景(業務)是聚合物件行為的唯一理由;複雜的場景是由簡單場景聚合而成。不管業務如何變化,總有子場景是不變的,這樣就能獲得最大的「維護利潤」(業務不變性)。
作為企業軟體開發而言,最大的挑戰就是業務變化。這一方面**於業務本身的變化(應用系統應用不斷深入和推廣),另一方面是我們對業務認識不斷深入的過程。不能適應變化的系統只有死路一條。複雜的業務要求軟體架構必須具備很強的適應能力。如前面所說,這是乙個漸進的過程。ddd本身就是為了解決複雜業務的軟體開發問題的。「如何避免顛覆式修改」是最大的挑戰。如果發現找的聚合根是錯誤的,那領域模型還可重用的價值還有多大,這種代價和成本是否能夠承受?
核心觀點:
每個人對業務認識的角度、深度和廣度都不同,得出的聚合根也就會不同;這才有了很多時候我們無法對誰是聚合根以及聚合根的邊界大小達成共識;
我們對業務的認識是乙個不斷深入的過程,在這個過程中我們的模型也會相應調整;
從ddd的最後落地實現角度來看,最終出來的是乙個個聚合。但是因為聚合不僅僅只是乙個根實體,而是還內聚了一堆子實體和值物件。那它的這種內聚結構對於後期因各種原因而發現原來的聚合是錯誤的時候,此時模型重構的成本和代價會相對於「乙個所有entity物件都地位平等的模型」的重構成本會更大,特別是在引入了event sourcing時問題更加凸顯,這點也可見我上篇發表的帖子;
DDD 聚合根的批量刪除是不是可以批量傳送請求
搞了近五年的系統開發,總是抱著一種思維模式,使用者的乙個操作對應乙個請求和乙個事務,比如 使用者選擇了n條記錄,我就會向伺服器發生乙個請求,伺服器在乙個事務中進行處理。前幾天在群裡乙個前輩反問 批量操作難道真的要在乙個事務中?這個問題讓陷入了反思,謝謝前輩們 魏瓊東 ddd中有聚合的概念,乙個聚合有...
什麼是聚合根
每個聚合都有乙個根實體 聚合根,aggregate root 這個根實體是聚合所表述的領域概念的主體,外部物件需要訪問聚合內的實體時,只能通過聚合根進行訪問,而不能直接訪問。從技術角度考慮,聚合確定了實體生命週期的關注範圍,即當某個實體被建立時,同時需要建立以其為根的整個聚合,而當持久化某個實體時,...
什麼是聚合根
每個聚合都有乙個根實體 聚合根,aggregate root 這個根實體是聚合所表述的領域概念的主體,外部物件需要訪問聚合內的實體時,只能通過聚合根進行訪問,而不能直接訪問。從技術角度考慮,聚合確定了實體生命週期的關注範圍,即當某個實體被建立時,同時需要建立以其為根的整個聚合,而當持久化某個實體時,...