关于DDD中Domain的思考
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
本文既不推銷UML,也不推廣DDD,更不涉及各種論戰(zhàn)。-- 作者
? ? 某天又一次打開關(guān)于DDD(領(lǐng)域驅(qū)動(dòng)設(shè)計(jì))的PDF文檔時(shí),自己有了個(gè)疑問:什么是領(lǐng)域(Domain)?譯文中是這樣描述領(lǐng)域:銀行業(yè)務(wù)被銀行的內(nèi)部人員和專家所熟知。他們知道所有的細(xì)節(jié)、所有的困難、所有可能?出現(xiàn)的問題、所有的業(yè)務(wù)規(guī)則。這些就是我們永遠(yuǎn)的起始點(diǎn):領(lǐng)域。如果這就是領(lǐng)域,它似乎不是"起始點(diǎn)",而是“全部”--全部的業(yè)務(wù)規(guī)則、全部的細(xì)節(jié)、全部可能出現(xiàn)的問題。我的疑問正是始于此:Domain映射到軟件,"全部"不就是整個(gè)系統(tǒng)?
? ? 這里有個(gè)概念漏洞,Domain是"全部",但不是全世界的"全部",那它是什么的全部?顯然,譯文中看到的"銀行業(yè)務(wù)",其對應(yīng)的Domain也不是指銀行業(yè)務(wù)系統(tǒng)的全部,因此Domain的概念相對清晰--一個(gè)有清晰邊界、內(nèi)部的業(yè)務(wù)、規(guī)則、問題、細(xì)節(jié)都自成一派--你會(huì)問我,這是指對象(Object)吧!如果從低層次上講,兩者是有關(guān)系的。下一個(gè)疑問:Domain和Object有什么不同?
? ? 我思考的結(jié)果是封裝的級別不同:Object封裝的目標(biāo)是調(diào)用其方法實(shí)現(xiàn)所承諾的功能,但系統(tǒng)中的對象是有依賴的;Domain封裝的目標(biāo)是"全部"都在這里,即不需要依賴其他的Object或者Domain。之所以這么想,主要的依據(jù)是從那個(gè)常用的例子:機(jī)場、航線、飛機(jī),雖然我看的譯文中把這三個(gè)定義為對象,使用UML畫了聚合關(guān)系;我更傾向于把它們看成Domain,即我認(rèn)為機(jī)場不會(huì)調(diào)用飛機(jī)的方法(或者人),兩者只是相互關(guān)注了對方(的事件)。例如,飛機(jī)A1和機(jī)場B1通過無線電溝通(消息)。Object間的消息一般是帶著發(fā)送者或者接受者的數(shù)據(jù),也就是A1發(fā)送的是B1要處理的;而Domain間的消息是否處理,如何處理則是完全由接收者自己處理,發(fā)送者也不關(guān)心消息的處理。再一個(gè)疑問:如何達(dá)到"全部"封裝?
? ? 上面的例子中,我使用了"事件"這個(gè)關(guān)鍵字。事件(消息)不是新鮮事物,在面向?qū)ο蟮南到y(tǒng)中,其作為異構(gòu)子系統(tǒng)、系統(tǒng)間異步調(diào)用的橋梁,起著重要的作用;所以我認(rèn)為“事件通知”不是實(shí)現(xiàn)Domain的途徑,因?yàn)樗峭秸{(diào)用的變種:消息的生產(chǎn)者和消費(fèi)者仍然有業(yè)務(wù)邏輯上的天然聯(lián)系。事件除了通知,還有一種模式是監(jiān)聽。這種事件是公共資源,是開放的標(biāo)準(zhǔn),不論采用廣播、總線、管道各種模式,Domain監(jiān)聽自己關(guān)注的事件,并對其進(jìn)行響應(yīng),如果產(chǎn)生了新的("開放")事件,則將事件發(fā)布回(廣播、總線、管道的)'通道'。以機(jī)場和飛機(jī)為例,機(jī)場廣播的跑道天氣信息,飛機(jī)的飛行員如果關(guān)心,則通過無線電接聽,如果不關(guān)心,則完全可以關(guān)閉無線電。
? ? 以上基本展示了我思考的過程。其間,我回顧了自己使用過的各種(X)O,(X)O包含面向服務(wù)(架構(gòu))-SO(A),面向方面(編程)-AO(P),面向?qū)ο?OO,面向過程-PO。
粗略地得到了下圖:
從上圖中除了有關(guān)于Domain的思考,還想了關(guān)于如何更好的使用各種方法論。我有個(gè)觀點(diǎn):同步就是兩次或者多次異步交互的集成。
? ? 畫圖的過程中,我又有了個(gè)疑問:服務(wù)間的異步通知類接口,是否是實(shí)現(xiàn)Domain的一種形態(tài)?通過與分布式服務(wù)系統(tǒng)的拆分,我認(rèn)為:異步通知(接口)是一種補(bǔ)充,而不是Domain間交互的主要方式,它類似“塔臺(tái)呼叫711,711聽到請回答”;如果全程都是這樣飛行,塔臺(tái)需要為每個(gè)飛機(jī)配置一個(gè)導(dǎo)航員,且每個(gè)飛機(jī)獨(dú)立使用一個(gè)頻率,這不是一個(gè)好設(shè)計(jì),盡管它在航空管制初期可能是可行的。
? ? 我的結(jié)論是:面向領(lǐng)域設(shè)計(jì)DDD中的領(lǐng)域是比對象、服務(wù)更加高度的封裝,領(lǐng)域包含自己的數(shù)據(jù)、行為、控制等"全部",并對外部事件(或者消息)做出響應(yīng),按照自己的規(guī)則完成特定的功能?;谶@樣的特點(diǎn),Domain間的通訊應(yīng)該是異步事件監(jiān)聽模式。在Domain內(nèi)部,可以利用面向?qū)ο蟆⒎?wù)及各種方法論開發(fā)更耦合的功能--這可以解釋為什么現(xiàn)在更多的系統(tǒng)是采用的同步調(diào)用方式運(yùn)行。這也是另一個(gè)層面的“外松內(nèi)緊”的耦合。
轉(zhuǎn)載于:https://my.oschina.net/u/1053238/blog/359106
總結(jié)
以上是生活随笔為你收集整理的关于DDD中Domain的思考的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hadoop开发第2期---虚拟机中搭建
- 下一篇: 解析url