<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          溫故知新——領(lǐng)域驅(qū)動設(shè)計(jì)

          共 1995字,需瀏覽 4分鐘

           ·

          2022-05-23 18:17

          這里是Z哥的個人公眾號

          每周五11:45 按時送達(dá)

          當(dāng)然了,也會時不時加個餐~

          我的第「225」篇原創(chuàng)敬上


          大家好,我是Z哥。
          這兩天正好有空,花了一下午的時間重新翻閱了一遍《領(lǐng)域驅(qū)動設(shè)計(jì)精粹》,結(jié)合最近一陣子的新項(xiàng)目開發(fā),有了一些新的感受和理解。這就是所謂的“溫故而知新”吧,在這里分享給大家。
          分享的這些點(diǎn),大多是在踐行「領(lǐng)域驅(qū)動設(shè)計(jì)(DDD)」時的關(guān)鍵點(diǎn),有助于「DDD」的落地。

          /01? 用「通用語言」描述業(yè)務(wù)場景/
          很多人覺得 DDD 很難落地的一個原因在于,團(tuán)隊(duì)中的所有人是否能夠?qū)诵母拍钚纬晒沧R。
          有一個很棒的方法是,平時要盡可能用「通用語言」來進(jìn)行溝通,并用于達(dá)成共識。
          書中有一個示例很棒:
          允許將每一個「待辦項(xiàng)」【提交】到某個「沖刺」中。只有「待辦項(xiàng)」位于「發(fā)布計(jì)劃」中時才能進(jìn)行【提交】。對于已經(jīng)提交過的「待辦項(xiàng)」如果想【再次提交】到另外一個「沖刺」中,需要先將其【回收】。{提交完成時},通知相關(guān)方【取消提交】的「沖刺」與【準(zhǔn)備提交】的「沖刺」。


          你看,這里面很清楚地表達(dá)了有哪些領(lǐng)域模型、操作、領(lǐng)域事件,以及它們之間的關(guān)系。
          我用【】標(biāo)注了操作,「」標(biāo)注了領(lǐng)域模型,{}標(biāo)注了領(lǐng)域事件。
          顯而易見,在團(tuán)隊(duì)中用這樣的方式進(jìn)行對齊,對于 DDD 的落地是非常有益的。

          /02? 不同定位的「子域」側(cè)重點(diǎn)/
          「子域」屬于業(yè)務(wù)「領(lǐng)域」的一部分。它與「限界上下文」的不同之處在于它更多是從技術(shù)角度去拆分「子域」,而「限界上下文」則是從業(yè)務(wù)角度去拆分的。
          根據(jù)「子域」的定位可以劃分為三大類:核心域、支撐子域、通用子域。
          核心域很顯而易見,是重中之重,大多數(shù)時候我們的精力都投入在這里。
          對于支撐子域,我們不需要過多考慮可擴(kuò)展性和兼容性,但是卻要特別注重可替代性。因?yàn)橹巫佑蚴谴我模瑢φ麄€項(xiàng)目的成敗影響很小。往往可以通過外包等方式通過外部資源來解決,并且可以隨著規(guī)模的發(fā)展而進(jìn)行替換或升級。
          對于通用子域,主要關(guān)注的是穩(wěn)定性和兼容性,因?yàn)樗鼈冇锌赡鼙欢鄠€領(lǐng)域使用。通用的軟件往往市面上也會有很多成熟的產(chǎn)品,我們可以通過購買的方式來快速獲得它們。但是在評估它們的時候,記得著重關(guān)注穩(wěn)定性和兼容性。

          /03? 增強(qiáng)事件和反向查詢/
          多個「限界上下文」之間的數(shù)據(jù)傳遞,無非兩種,一種是由數(shù)據(jù)的生產(chǎn)方通過 MQ 主動傳遞,另一種是由數(shù)據(jù)的需要方通過 RPC 反向查詢。
          可能很多人對于這兩個方案該如何選擇有點(diǎn)搞不明白。
          書中提到的一個思路很棒,概括地來說就是:如果你希望數(shù)據(jù)的消費(fèi)者有更多地自治權(quán),那么就選擇增強(qiáng)事件。而如果你的消費(fèi)者有很多,并且不同消費(fèi)者對關(guān)心的數(shù)據(jù)差異又比較大,那么用輕量的事件配合靈活豐富的查詢 API(比如 GraphQL)更適合。

          /04? 值對象不僅僅是“不可變”/
          相信只要對 DDD 有些了解的小伙伴應(yīng)該都知道「值對象」的「不可變性」。但可能很少人能描述出它的真正作用。
          「值對象」的作用是:描述、量化或者測量一個實(shí)體。

          /05? 避免過度抽象/
          代碼里的抽象和現(xiàn)實(shí)生活中的抽象其實(shí)是一樣的,從本質(zhì)上來說,抽象可以是無止境的。但是,越抽象,理解的成本就越高。
          在 DDD 這種崇尚代碼會說話,能表達(dá)業(yè)務(wù)的編程理念中,我們就得避免過度抽象了。過度抽象一個很常見的信號是:為了兩個大多數(shù)屬性字段相同的模型能復(fù)用,通過 Type 來區(qū)分在不同場景下的不同含義。

          /06? 如何定義聚合的邊界/
          每個聚合需要設(shè)計(jì)得恰好好處,才能既不過度耦合,又能避免事務(wù)顆粒度過大。
          我們可以用下面的思路來進(jìn)行,分為兩步:
          1. 先定義用來識別和查詢聚合的字段/屬性。

          2. 再填充用于構(gòu)造聚合并使之處于有效初始狀態(tài)的內(nèi)在屬性。



          /07? 用「事件風(fēng)暴」加速領(lǐng)域設(shè)計(jì)/
          領(lǐng)域模型、領(lǐng)域事件等的設(shè)計(jì)需要花很多時間討論、打磨、再沉淀下來。書中分享了一種方式——「事件風(fēng)暴」。
          介紹這個部分的篇幅比較長,但是非常建議大家自己去看一遍。簡單概括下來實(shí)踐事件風(fēng)暴分為以下幾個步驟:
          1. 定義事件

          2. 定義操作(命令)

          3. 設(shè)計(jì)聚合

          4. 識別限界上下文和數(shù)據(jù)流向

          5. 構(gòu)思操作人的使用場景和UI設(shè)計(jì)


          另外,在事件風(fēng)暴中討論出來的概念,可以根據(jù)簡單、適中、復(fù)雜來進(jìn)行開發(fā)時間的預(yù)估。由于顆粒度足夠細(xì),還是很有參考價值的。并且當(dāng)這些概念都一一實(shí)現(xiàn)之后,整個系統(tǒng)開發(fā)也就完成了。

          好了,Z哥這次的收獲就是這些,希望對你有所幫助。
          最近幾年,DDD 被越來越多地的提到,說明在當(dāng)今軟件系統(tǒng)越來越復(fù)雜的背景下,更適合 DDD 發(fā)揮它的價值。強(qiáng)烈推薦每一位開發(fā)者去學(xué)習(xí)它、掌握它。



          推薦閱讀:


          原創(chuàng)不易,如果你覺得這篇文章還不錯,就「點(diǎn)贊」或者「在看」一下吧,鼓勵我的創(chuàng)作 :)


          也可以分享我的公眾號名片給有需要的朋友們。

          如果你有關(guān)于軟件架構(gòu)、分布式系統(tǒng)、產(chǎn)品、運(yùn)營的困惑

          可以試試點(diǎn)擊「閱讀原文

          瀏覽 29
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  精品视频在线观看免费 | 大屌操大逼 | 亚洲精品综合在线 | 亚洲欧美一区二区三区久本道 | 天天拍天天操天天干 |