主頁 > 軟體設計 > 戲說領域驅動設計(六)——限界背景關系——設計

戲說領域驅動設計(六)——限界背景關系——設計

2022-02-23 07:21:53 軟體設計

  限界背景關系(簡稱BC)是一個很難講的部分,我尋思著是不是再多找一找文章,看看其它人怎么講的,但猶豫再三還是決定按自已的理解去聊,各種找材料就有點剽竊的行為了,至于說的是否正確,您務必也要做好判斷,畢竟每個人都會有自己的理解,做為溫故而知新的一部分,在此把前面總結的BC的特點再重復一下,也不是為了湊字兒,DDD這東西就得靠多多的啰嗦才能記得住,畢竟概念忒多,此外,為提升您的閱讀體驗,限界背景關系分為兩節分別講解,

  BC的特點包括四個方面:1)是系統的物理劃分;2)應根據子域的定義進行推導;3)限定了領域模型的邊界,是對領域模型的一種劃分和限定;4)BC內每個領域術語都有且只有一個明確的含義(即通用語言),

  BC的設計一般是通過子域進行推導,假如將DDD的指導分成三部分:子域設計、BC設計和代碼設計,BC屬第二層,起到承上啟下的作用,在將業務模型轉換為技術的程序中提供宏觀指導,BC定義的程序其實就是確認有幾個子系統(或Java中的包、.NET中的名稱空間),有哪些領域模型(此處的領域模型是一種業務術語不是指‘類’或‘介面’)以及子系統間如何互動,從上述概念上可以看出來,討論BC時既有業務的部分也有技術的內容,

領域模型

1、領域模型的使用貫穿了“分析”、“設計”、“開發”的整個流程,各類人員都應該使用領域模進行溝通和交流,避免系統在實作程序中需求走樣

2、領域模型只反映業務與技術無關,其不僅包括業務中的物體如“訂單”、“客戶”等還包含業務流程如“下訂單”

3、領域模型是有邊界的,我們只應該關注業務所關注的部份

  在進入BC的討論之前,首先介紹一些基本概念避免后續我們用到的時候作為讀者的您一臉的蒙圈,怪我不事先說事后賣關子,第一個介紹的詞叫“建模”,第二個要介紹的詞是“模型”,不論是作為軟體開發老炮兒還是菜鳥,您可能在無數的場合聽了無數次的這個詞,遙想當前我初來乍到,但凡聽誰說在做軟體建模,給我的第一印象就是這人妥妥的大牛一個,那它到底是什么意思呢?咱換成人話就是:比如有這么一個事兒,我嘴笨和您說不明白,那就寫一段兒或者畫個圖,反正不管用什么手段,只要您懂了我的意圖咱這目的就達到了,這里所說的“一段文字”或“圖”就是模型,干這個事情的程序就叫“建模”,所以您不管是做設計子域還是BC還是畫流程圖,都是建模,不知道為什么非得用“建模”,IT圈就是不喜歡說人話,

  題外話:中國IT圈對一些詞的翻譯我覺得真是前無古人:句柄、多型、建模、閉包……這翻譯,不服來戰,

  回到正題,在軟體設計活動中(嚴謹的說是在UML建模程序中)包含三類模型:業務模型、分析模型和設計模型,具體解釋如下串列,不過咱得多說一句,我們常見的類圖啊、時序圖啊,你可別認為這些模型僅用于實施前的設計階段,在業務分析階段也是可以用的,只是目的不一樣,您可別回頭一說類圖就認為只在軟體設計階段專用,對外行說說就行了,內行咱得有內行的專業素養,

  • 業務模型:用于解釋與說明業務邏輯的各類檔案或圖,與是否有電腦無關系,是對客觀的業務的描述,子域設計即是業務模型設計,
  • 分析模型:用于說明哪些業務可在軟體系統中實作(并非所有的業務都可被落實到軟體中,這就是為什么常常見到開發與產品經理互撕),其上面連接了業務模型下面對應到設計模型,BC設計即分析模型設計,
  • 設計模型:用于說明軟體在代碼層次上的設計方式,常見的如類圖、活動圖、時序圖等,DDD戰術階段所建模型如聚合、物體即為設計模型,

   我不僅說了三個模型還能套在DDD上,一是沒跑題,二是顯得專業,能這個事兒圓回來,我自己都佩服自己,另外著重說一點,所有的模型里,檔案是最重要的,具體您自行體會,關于檔案這個事情,也再多啰嗦幾句,一般來說不建議花精力在代碼設計階段撰寫大量的檔案,一是會很占用時間二是幾乎沒有多少公司能保證代碼變化的同時檔案也隨之變化,在此情況下檔案不僅不能說明問題還特別耽誤事兒,But,業務模型檔案是必需的,這東西變化率不是很高,您也別跟我抬扛,一個企業的業務模型天天變化,我勸您趁早離職,他自己都沒找到方向,至于分析模型,屬于過渡型檔案,視具體情況而定,

  上一章中展示了個人微信的域圖,為避免誤會本節以一款“即使通訊軟體”的后端架構為例展示限界背景關系的設計圖,由于并無實際的軟體,您仍可以微信為對照,我得先避個嫌疑,回頭騰訊公司找過了就蝦米了……另外,實際的系統架構比案例復雜的多的多,劃分得也會更加的詳細,此處僅做為引子告訴您如何進行BC設計,您在日常作業中需要學會舉一反三,這也是治學問的正確姿勢,時間久了,你就能體會何為“眾里尋他千百度,驀然回首,那人卻在,燈火闌珊處”,

 

   為能說明問題,本例中把“小程式管理子域”和“鑒權子域”去掉了,圖不好畫(其實主要是影響您的閱讀體驗),此外,上一章針對“通訊錄子域”和“聊天子域”的設計不夠細致,需要進行細化,下圖為兩個子域的細化結果,注意:此處的設計仍為子域圖,尚未到BC設計階段,

 

      

   子域經過細化后我們建立了下面的BC圖,需要注意的是BC設計圖中應該以實線表示每一個限界背景關系,因為BC具備物理特性已非概念上的模型, BC間的互動通過實線進行連接,

 

 

    BC的設計不僅需要子域設計為參考,還需要結合您的團隊與公司的實際情況進行計,本案例的建設由同一部門的人數為200的成員所組成的團隊,包括研發、測驗、運維、產品經理、專案經理等基本角色,因資源充沛且崗位齊全,確定使用微服務架構作作為系統落地時的方案,我們來詳細解釋一下本方案的設計依據,

  1. 聊天子域:分為“通訊管理”和“歷史訊息管理”兩個子系統,前者用于聊天場景比如發送各類文本、圖片等;后者用于對歷史訊息進行存盤以用于記錄查詢,這兩個BC所關注的業務點有很大差異,邊界較為明顯,兩個BC可使用不同的系統架構并可獨立進化,
  2. 訊息審計使用了第三方采購的實時審計系統用于對用戶所發的朋友圈或訊息進行審計以避免非法內容的存在,
  3. 通訊錄子域分為兩個BC:“聯系人管理”和“好友關系管理”分別用于管理本賬戶的聯系人和用于朋友推薦的推薦系統,

   一般來說BC和子域是可以一一對應的,當然,具體情況還要視您所在公司和團隊的架構,假如說子域的設計是專案的開端,那BC的設計的好壞幾乎可以決定系統的成敗,應當是設計程序中投入精力最多的地方,其原因前面已然說過:子域劃定了一個個小的物理系統,天然具備隔離效果,當您的系統具備良好的BC設計時,即便某個BC出現失敗也不會導致整個系統的業務雪崩,后面我們談到DDD的隔離機制時您就會發現為什么BC的隔離是最為核心和關鍵的,

  BC的設計粒度,往大了看其實可以是一個子系統本身,單體系統只有一個BC(此種情況下,單系統已經不能算是純粹上的BC,應當以“包”或“名稱空間”作為BC的基本單位);往小的方面看,最小的粒度為“聚合”,切記!真的不能再小了,無論其大小,關鍵的設計原則是“完整”即BC可以完整的支撐某項業務,換另外的說法就是每個BC應該是自治的且與其它BC有清晰的邊界,實際上,當您在BC設計時會發現大部分情況下尋找BC邊界是一個非常自然的程序,還是那句話:人是有靈性的,

注意!

系統的建設程序(開發階段)中,請務必保證您的領域模型不能外泄到BC之外,這里的BC可以是一個專案也可以是一個包或名稱空間,BC間的互動只能通過DTO或訊息(其實訊息也是一種DTO)

    實際上,BC的設計程序中還是有許多的原則可以遵守的,在此一一列舉出來,

  1. BC的設計是系統的宏觀架構設計,一經確認后就需要以此為依據進行實施
  2. 以業務維度為準進行BC設計,這一潭訓存在例外:前后端分離架構,是一種比較典型的以技術為參照的的BC設計方式,就前端是否屬于BC一部分的問題目前還是有一定的爭議的,比較權威的書上的回答也是“Yes”,為此還引入了微前端的技術,我個人建議您視自己的公司與團隊情況而定,不必拘泥于理論,
  3. BC設計需要以您的組織結構包括團隊技術層次、團隊組織結構、是否跨部門、人力資源情況等為參考以免雖有設計方案但無法落地,陷入紙上談兵的境界,造成前期作業浪費,
  4. BC也需要保持隨時變更,尤其是在子域有變更的情況下
  5. DDD中最為重要的規律是“運動與適應”,一切事務皆在變化中,您需要隨時根據變化做調整
  6. 現實中,有些帶頭大哥喜歡根據開發任務來設計BC,這種情況最好少用以減少甩鍋的情況,另外,個人建議BC的開發作業只由一個人負責即由上面的service到最下面的dao,不要針對同一個聚合讓過多的人參與,每個人都有自己的設計思路,非常容易出現重復性的內容;一個研發人員的連貫性思路也很容易被打斷,如果BC較大,也請限制在一個團隊內以減少溝通成本
  7. 限界背景關系的識別實際上并沒有標準可言,可以通過業務復雜度、管理復雜度和技術復雜度去分析和識別,迭代化的進行分析 ,

  為了讓您明白,我們再整一個例子,這里以一個電商購物系統為例,展示其BC的設計方式,本案例中,團隊人員較少,由開發人員承擔著運維的職責;系統客戶物件以企業內部用戶為主,為方便說明,我們仍只展示部分子域:核心域中的銷售子域,如下圖所示,

  依據上圖所示的子域說明,推匯出如下BC設計,

  不同于第一個案例,本例未使用微服務架構,而是使用了單體架構作為其落地方式,我知道有些人是強烈的微服務架構擁護者,但我仍然需要在此強調:系統的架構選擇時,技術能力僅僅是一方面,而且還只是很小的一個方面,決策我們架構選擇的因素有許多,比如團隊的綜合能力(注意:不能以團隊中是否有一兩個高手來決策團隊綜合能力)、團隊結構、公司的總體結構(尤其您要做的系統是業務中臺時)等,專案背景中已說明“開發兼職運維”,說明當前團隊使用容器化部署、鏈路追蹤、全堆疊監控等技術時會比較勉強,即使強加到系統中也會由于資源的不足造成您想要的結果與期望不匹配,

  最后需要說一句,我們都知道微服務架構有各種優勢,也知道單體系統有各種不足,但任何事務都有其兩面性,在您使用的時候需要首先綜合評估自身所具備的條件,再說了,您做的系統不是一錘子買賣,隨著后續資源的投入,您是可以進行架構優化的,

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/431037.html

標籤:其他

上一篇:java 往 pdf 插入資料 (pdfbox+poi)

下一篇:(翻譯) CAP 理論 FAQ

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more