# Domain Driven Design **What is Domain?** Problem Domain 問題領域 (現實生活) PM想的某些功能,真實的問題 例如:如何降低客戶的AR流失率 Solution Domain Program, Domain Model 嘗試碩模,先碩模在變成程式 這兩個東西通常會有GAP存在 Gap越大,系統越難維護 **Domain Model** 理論上大家看得比較多的是Data Model,比較少看過Domain Model。 貧血模型(Data Model)、充血模型 (Domain Model) Data可能是屬性,也會把規則放在他身上 Domain Model 並不是越真實越好 不然雜訊會太多,需要的東西才是重要的,夠用就好 捷運圖就是一個很好的領域抽象圖 難到地圖一定是長這樣嗎? 我是想知道怎麼搭捷運,針對這個問題來碩摩,做出一個捷運圖。 **Domain Event** PM有興趣或在意的一些事情,客戶帳號的建立、訂單被送出...等,叫做一個Domain的Event。 有些事情我自己知道就好,有些事情外面的人也要知道。 像是我收到東西要通知客戶 透過Event來溝通,是為了解偶,降低相依姓。 怎麼樣重播事情 相依反轉 某個資料被寫入 系統事件 某個商業流程被發生 才是重點 **What is Driven** TDD Test-Driven Design BDD Behavior-Driven Design DDD Data-Driven Design, Domain Design driven What is Design? * 設定就是決定Form與Context的邊界 * 設計邊界的因素: Force (作用力/約束條件) * Force型塑Form 鎖定問題,解決他 就是"設計" **所以什麼是DDD?** 針對領域中重要的概念, 透過跟PM還有專家的合作,把他的話塑成一個模型,然後翻譯成Code。 跟OAD有甚麼不同? 加強版,物件導向要自己想, 引導你如何去做,讓跟商業不要脫勾, 所以會有一些副產品跑出 我們要能夠講一樣的話,定義出領域模型 理論上他講的話可以直接變成Code 換言之 專家也可以理解我們的模型,所以他會克制 DDD重要的觀念/名詞 Context Domain Domain Model Domain Event Ubiquitous Language Bounded Context Strategic Design -Hight level design of problem domain Tactical Domain **Why DDD?** * Improved Commynucation * Flexibility * Business-Focused 要解決複雜的商業問題, * Efficiency/Better Code **Event Storming Introducation** 利用Event Storming是協助提煉出各個Business的Domain Model。 **為什麼DDD活起來** 因為有微服務出現,Infra變大,要怎麼切是大家在想的問題。 **From monolith to Microservices + microfrontend** * Monolithic * Frontend Backend * Frontend Microservice * Microfrontend Microservice (只有在業務非常複雜才會這樣做) **Database vs Domain Driven Design** Database Driven design (Anemic domain model) 容易失控,因為商業邏輯都在Code內,不在Domain這 * Create POST/api/members * Read GET/api/members/{id} * Update PUT/api/members/{id} * Delete DELETE/api/members/{id} Domain Driven Design (Rich domain model) * Register POST/api/members * Verify POST/api/members/{id} * Ban POST/api/members/{id} * Recover POST/api/members/{id} * Remove DELETE/api/members/{id} **Layers** Application Layer - API,會有DI Domain Model Layer - 商業邏輯,很多Use Case Infrastructure Layer - DB