Upgrade to Pro — share decks privately, control downloads, hide ads and more …

淺談領域驅動設計

James Wang
January 20, 2022

 淺談領域驅動設計

本次受邀參加【蔣幹話軟體】邀約,線上淺談一場領域驅動設計(Domain Driven Design, DDD)。

本次從軟體架構切入,從領域分析談到設計,帶出整個戰略流程的講解,歡迎大家共同討論。

James Wang

January 20, 2022
Tweet

More Decks by James Wang

Other Decks in Design

Transcript

  1. 大家會遇到的問題 A big ball of mud is a haphazardly structured,

    sprawling, sloppy, duct-tape-and-baling- wire, spaghetti-code jungle. These systems show unmistakable signs of unregulated growth, and repeated, expedient repair. —Brian Foote and Joseph Yoder
  2. Domain Model B 你還需要 Domain User Interface Application Domain Domain

    Model A User Interface Application Domain Domain Model C User Interface Application Domain 領域分割 技 術 分 割
  3. 你還需要 Domain – BUT! Domain Model B User Interface Application

    Domain Domain Model A User Interface Application Domain Domain Model C User Interface Application Domain 1. 我們如何切分 Domain? 2. Domain 間如何 溝通? 3. 我們如何設計 Domain? 1. 如何切分? 3. 如何設計? 2. 如何溝通?
  4. 浮現商業結構之其他判斷指標 1. Activities that only involve one actor. 只有一個參與者,獨自做了許多事 2.

    One-way information flow. 單向資訊流 3. Different triggers. 不同的觸發點 4. Activities supporting something that is not in the picture. 不屬於這個領域故事的活動行為 5. Differences in language. 同樣的事物有不同的名稱 6. Different use of the same thing. 同樣的事物有不同用途 這些指標,僅供參考。
  5. 浮現商業結構後 • 識別核心子領域、通用子領域、支撐子領域。 • 識別痛點。 • 識別風險或價值。 • 尋找價值流(Value Stream)。

    以上目的是尋找最小可行性產品(MVP),有價值的事情優先處理。 下一步,流程建模(Process Modeling)。
  6. 流程建模 - 以房貸商業流程為例 徵信 1. 此案例還能再往下細化,譬如如何建立信評模型?譬如徵信報告書格式 與內容?譬如與 JCIC 系統溝通模式? 2.

    如果分析過程中遇到模糊或不確定內容,建議可以使用具體案例,透過 舉例方式讓團隊達成共識。
  7. 當我們針對 MVP 逐一建立流程建模後 徵信 客 戶 帳務 客 戶 鑑價

    客 戶 授信 客 戶 發現「客戶」這概念重複出現在很多地方 1. 將「客戶」這概念提取出來 2. 將「客戶」這概念放在各服務中
  8. Bounded Contexts - 以房貸商業流程為例 客戶 徵信 授信 鑑價 帳務 催收

    債協 詞 彙 表 詞 彙 表 詞 彙 表 詞 彙 表 詞 彙 表 詞 彙 表
  9. Recap - 我們如何切分 Domain? • 從商業流程(Business Flow)下手。 • 區分子領域( Sub-Domain

    / Emerging Bounded Contexts)。 • 探討細部流程(Processes)。 • 從細部流程中識別價值流程(Value Stream)。 • 基於以上基礎下,歸納統整出限界上下文(Bounded Contexts)。 A bounded context is the boundary of a model that represents those concepts, their relationships, and their rules. The same subdomain could be represented by an infinite number of modelling choices. Source: Domain, Subdomain, Bounded Context, Problem/Solution Space in DDD: Clearly Defined | by Nick Tune
  10. Context Map 定義:Context Maps describe the contact between bounded contexts

    and teams with a collection of patterns. 理想中,我們希望每個 Bounded Context 獨立自主提供業務服 務(無耦合)。 現實中,多個 Bounded Contexts 互相協作提供業務服務(低 耦合)。 所以接下來我們要識別出 Bounded Contexts 間的關連以及如 何溝通。
  11. Context Map - 識別上下游 U: Upstream 上游 D: Downstream 下游

    BC BC BC U U D D Downstream 依賴於 Upstream 外部系統 D U
  12. Integration Using Message Context A Context B Event Bus Outbox

    Outbox Inbox Inbox Event Handler Event Handler Source: GitHub - kgrzybek/modular-monolith-with-ddd: Full Modular Monolith application with Domain-Driven Design approach.
  13. Context Map 上加上溝通模式 BC BC BC U U D D

    外部系統 D U ACL ACL Queue 同步 非同步
  14. 依賴規則 Source code dependencies must point only inward, toward higher-level

    policies. 原始碼依賴關係只能指向內部,朝向更高層級的策略。
  15. 【高層】 【低層】 Dependencies Order Service Data Access Data Providers UI

    Web Api JSON JSON 依賴規則 – 舉個例子 User 我想查詢 訂單資料 Order Domain
  16. 【高層】 【低層】 Dependencies Order Service Data Access Data Providers UI

    Web Api JSON JSON 依賴規則 – 舉個例子 User 我想查詢 訂單資料 Order Domain <<Interface>> IOrderRepository 透過依賴反轉讓相依永遠從低層指向高層
  17. 關於高層不相依任何人 I have accepted Log4Net into the core because of

    its history of stability and small surface area. - Jeffrey Palermo 洋蔥架構提出者 Q:意思是最高層一定沒有相依任何第三方套件嗎? I have accepted Log4Net into the core because of its history of stability and small surface area. - Jeffrey Palermo 洋蔥架構提出者 Q:意思是最高層一定沒有相依任何第三方套件嗎?
  18. 下一步,更細顆粒度的建模 在此之前,要先了解以下知識: • Aggregate Root • Entity • Value Object

    • Domain Event • Domain Service • Application Service • Repository • …… 以上內容可以講個三天三夜,故有興趣的人可以找 DDD 的書學習。
  19. 猜猜我是誰? 猜猜我是誰 ├── catalog ├── inventory └── order ├── domain

    │ └── model │ └── order.ts ├── repository │ └── orderRepository.ts └── useCase ├── createOrder.ts ├── getOrderList.ts └── updateOrder.ts 猜猜我是誰 ├── api ├── application └── domain ├── aggregate │ └── order │ └── order.ts │ └── orderIdVO.ts │ └── catalog │ └── catalog.ts │ └── inventory └── service Source: 軟體架構淺談 - iT 邦幫忙
  20. 關於領域驅動設計 • 軟體開發的本質是滿足業務領域。 • 越複雜的領域,越需要被設計。 • 越複雜的領域越難設計,所以我們要將複雜的大問題拆分多個小問題。 • 小問題逐一解決,就沒有大問題了。 •

    所謂領域驅動設計,核心就在拆分,確立各種邊界(Boundary)。從 Domain 到 Sub-Domains 到 Bounded Contexts 到 Aggregates,一路 從戰略需求面到戰術實作面。 • 然而複雜領域無法一個人處理,所以要團隊大家與領域專家一起面對領域。