談?wù)劥a:DDD從入門到完全入門

本文首發(fā)于泊浮目的簡(jiǎn)書:http://www.reibang.com/u/204b8aaab8ba

版本 日期 備注
1.0 2021.8.22 文章首發(fā)
1.1 2021.8.26 增加對(duì)于核心思想的描述

之前的DDD文章——談?wù)劥a:降低復(fù)雜度,從放棄三層架構(gòu)到DDD入門丈冬,通篇下來(lái)像 是簡(jiǎn)單的講了一些概念嘱函,然后快速的實(shí)戰(zhàn)一下——很多同學(xué)反饋感覺(jué)就是入門了,但沒(méi)有完全入門埂蕊,因此我們?cè)偌右黄?/p>

1.什么是DDD

先看下萬(wàn)能的維基百科:Domain-driven design (DDD) is the concept that the structure and language of software code (class names, class methods, class variables) should match the business domain. For example, if a software processes loan applications, it might have classes such as LoanApplication and Customer, and methods such as AcceptOffer and Withdraw.

這邊將其稱為了一個(gè)概念往弓。在我看來(lái)DDD是設(shè)計(jì)模式的超集,一種指導(dǎo)思想——用來(lái)指導(dǎo)如何解耦業(yè)務(wù)系統(tǒng)蓄氧,劃分業(yè)務(wù)模塊函似,定義業(yè)務(wù)領(lǐng)域模型及其交互。

2. DDD誕生的背景

領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)這個(gè)概念并不新穎喉童,早在 2004 年就被提出了撇寞,到現(xiàn)在已經(jīng)有十幾年的歷史了。不過(guò)堂氯,它被大眾熟知重抖,還是基于另一個(gè)概念的興起,那就是微服務(wù)祖灰。因此在實(shí)現(xiàn)的時(shí)候樣子不一定是一模一樣的钟沛,更多時(shí)候還是根據(jù)業(yè)務(wù)場(chǎng)景來(lái)因材施教。

3. DDD的核心思想

核心思想是讓技術(shù)復(fù)雜度與業(yè)務(wù)復(fù)雜度隔離局扶,并通過(guò)統(tǒng)一語(yǔ)言組織業(yè)務(wù)邏輯恨统,降低認(rèn)知成本叁扫。

具體主要體現(xiàn)在:

  • 基礎(chǔ)設(shè)施層:它負(fù)責(zé)隔離技術(shù)復(fù)雜度,通過(guò)抽象封裝來(lái)對(duì)內(nèi)提供服務(wù)畜埋,而不是讓內(nèi)部服務(wù)直接使用它莫绣。這意味著當(dāng)外部基礎(chǔ)設(shè)施變化時(shí),業(yè)務(wù)并不會(huì)被迫進(jìn)行變更悠鞍。比如項(xiàng)目中的數(shù)據(jù)總線是Kafka对室,之后替換成了Pulsar,業(yè)務(wù)對(duì)其應(yīng)該是無(wú)感知的咖祭。
  • 厚領(lǐng)域?qū)樱和活I(lǐng)域的知識(shí)聚合在一個(gè)領(lǐng)域中掩宜,領(lǐng)域知識(shí)不再被割裂。這是單一職責(zé)原則的一種體現(xiàn)么翰。
  • 實(shí)體:用充血模型代替貧血模型牺汤,完全符合面向?qū)ο蟮乃枷搿I(yè)務(wù)中的對(duì)象完全投射到實(shí)體中浩嫌,從面向資源轉(zhuǎn)換成面向過(guò)程和面向?qū)ο蟆?/li>

4. DDD能解決什么樣的問(wèn)題

一般軟件會(huì)經(jīng)歷幾個(gè)不同的周期:

  1. 大煙囪:每個(gè)應(yīng)用各自為政檐迟,類似的需求重復(fù)開發(fā),浪費(fèi)人力
  2. 服務(wù)化:根據(jù)不同的業(yè)務(wù)屬性拆分服務(wù)码耐。關(guān)注服務(wù)拆分追迟、服務(wù)治理、模型抽象
  3. 平臺(tái)化:將相關(guān)的微服務(wù)同一成一個(gè)平臺(tái)暴露出來(lái)骚腥。關(guān)注領(lǐng)域收斂怔匣、領(lǐng)域自治、能力沉淀
  4. 中臺(tái)化:將通用能力下沉至中臺(tái)桦沉,快速響應(yīng)前端服務(wù)。需要關(guān)注數(shù)據(jù)打通金闽、能力串聯(lián)纯露、業(yè)務(wù)響應(yīng)力

DDD主要在技術(shù)密集型應(yīng)用里有較大的作用,尤其是當(dāng)該應(yīng)用進(jìn)入服務(wù)化代芜、平臺(tái)化時(shí)埠褪,可以在:“服務(wù)拆分”、“服務(wù)治理”挤庇、“領(lǐng)域收斂”钞速、“領(lǐng)域自治”發(fā)揮。在中臺(tái)化中的“數(shù)據(jù)打通”也有一定的作用嫡秕。

而微觀來(lái)說(shuō)渴语,DDD可以有效減少代碼的冗余程度以及需求響應(yīng)的速度。

5. DDD實(shí)踐中要注意的

5.1 使用IOC來(lái)保證層次之間的隔離

經(jīng)常有小伙伴問(wèn)我昆咽,分層之間該怎么做驾凶?因?yàn)榉謱拥倪吔鐩](méi)做好牙甫,代碼會(huì)再度耦合再一起。對(duì)此我給出的答案是參考inversion of control调违。其常見(jiàn)實(shí)現(xiàn)有:

  • Object Dependency Inject
  • Service Provider Interface
  • Strategy
  • Abstract Factory

也可以參考我之前寫的文章:技巧:遵循Clean Architecture寫好白盒測(cè)試窟哺。

5.2 模塊分離

模塊分離是一種較為“硬”的手段,它讓分層不再是一個(gè)約定技肩,而是強(qiáng)制執(zhí)行的規(guī)則且轨。這樣當(dāng)我們拆分微服務(wù)時(shí)候,也可以較快的完成拆分虚婿。

5.3 DDD并不是只有三層到四層

也有小伙伴問(wèn)過(guò)我旋奢,轉(zhuǎn)DDD的是否只有三層過(guò)來(lái)的?其實(shí)并非如此雳锋。我這邊可以舉兩個(gè)例子:

5.3.1 流計(jì)算處理

我們以面向在線數(shù)據(jù)加密應(yīng)用為例子:當(dāng)一條數(shù)據(jù)流過(guò)我們的應(yīng)用時(shí)黄绩,我們需要根據(jù)一些條件對(duì)其加密。

應(yīng)用的基本流程為:Source(from kafka) -> Map(encryption) -> Sink(to kafka)玷过。

那么代碼中爽丹,kafka其實(shí)是基礎(chǔ)層的代碼。而encryption屬于領(lǐng)域?qū)有廖茫琺ap(框架)和encryption之間的膠水代碼則屬于基礎(chǔ)層粤蝎。

5.3.2 GUI應(yīng)用

相信大家都在學(xué)生時(shí)代學(xué)過(guò)GUI or HTML 編程。那么按照DDD的做法來(lái)袋马,業(yè)務(wù)邏輯應(yīng)該與具體的界面無(wú)關(guān)——比如界面上的一個(gè)按鈕(數(shù)據(jù)模型)會(huì)觸發(fā)一種事件初澎,當(dāng)后臺(tái)的事件接受者收到這個(gè)事件時(shí),則會(huì)尋找相應(yīng)的執(zhí)行者虑凛,執(zhí)行對(duì)應(yīng)的邏輯碑宴。

在這里面:

  • 界面可以是Qt,可以是Flex桑谍,可以是Ios延柠,可以是Android,也可以是Vue锣披。其本質(zhì)是用戶接口層贞间。
  • 后臺(tái)的事件接受者是基礎(chǔ)層。
  • 具體的執(zhí)行邏輯則放在領(lǐng)域?qū)印?/li>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末雹仿,一起剝皮案震驚了整個(gè)濱河市增热,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌胧辽,老刑警劉巖峻仇,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異邑商,居然都是意外死亡础浮,警方通過(guò)查閱死者的電腦和手機(jī)帆调,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)豆同,“玉大人番刊,你說(shuō)我怎么就攤上這事∮靶猓” “怎么了芹务?”我有些...
    開封第一講書人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)鸭廷。 經(jīng)常有香客問(wèn)我枣抱,道長(zhǎng),這世上最難降的妖魔是什么辆床? 我笑而不...
    開封第一講書人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任佳晶,我火速辦了婚禮,結(jié)果婚禮上讼载,老公的妹妹穿的比我還像新娘轿秧。我一直安慰自己,他們只是感情好咨堤,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開白布菇篡。 她就那樣靜靜地躺著,像睡著了一般一喘。 火紅的嫁衣襯著肌膚如雪驱还。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評(píng)論 1 305
  • 那天凸克,我揣著相機(jī)與錄音议蟆,去河邊找鬼。 笑死萎战,一個(gè)胖子當(dāng)著我的面吹牛咐容,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播撞鹉,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼颖侄!你這毒婦竟也來(lái)了鸟雏?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤览祖,失蹤者是張志新(化名)和其女友劉穎孝鹊,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體展蒂,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡又活,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年苔咪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片柳骄。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡团赏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出耐薯,到底是詐尸還是另有隱情舔清,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布曲初,位于F島的核電站体谒,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏臼婆。R本人自食惡果不足惜抒痒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望颁褂。 院中可真熱鬧故响,春花似錦、人聲如沸痢虹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)奖唯。三九已至惨缆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間丰捷,已是汗流浹背坯墨。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留病往,地道東北人捣染。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像停巷,于是被迫代替她去往敵國(guó)和親耍攘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容