Teddy Chen
teddy@teddysoft.tw
http://teddy-chen-tw.blogspot.tw/
Oct. 16 2021 @ DDD TW
16:30~17:20
Copyright@2021 Teddysoft
• 聽過DDD請舉手
• 實作過DDD請舉手
• 聽過DCI請舉手
• 實作過DCI請舉手
• 以上皆是請舉手
Copyright@2021 Teddysoft
Copyright@2021 Teddysoft
• 土豆
• 勉強
Copyright@2021 Teddysoft
1. 事 物 的 意 義 , 須 放 在 特 定
Context 之下討論才有意義
2. 相 同 概 念 ( 名 詞 ), 在 不 同
Context之下可能有不同意義
Copyright@2021 Teddysoft
Copyright© 2021 Teddysoft 《ezKanban》
Bounded Context裡面
有什麼?
Copyright@2021 Teddysoft
Copyright© 2021 Teddysoft 《Domain-Driven Design: Tackling Complexity in the Heart of Software》
Domain
Events
Ubiquitous
Language
Bounded
Context define model within
names enter
model gives structure to
express model with
Copyright@2021 Teddysoft 《ezKanban》
貧血好還是充血好?
Copyright@2021 Teddysoft
Copyright@2021 Teddysoft
Use Case是一種Context嗎?
Copyright@2021 Teddysoft
DDD有提到Use Case嗎?
Copyright@2021 Teddysoft
Copyright© 2021 Teddysoft 《Domain-Driven Design: Tackling Complexity in the Heart of Software》
Domain
Events
Ubiquitous
Language
Bounded
Context define model within
names enter
model gives structure to
express model with
Copyright© 2021 Teddysoft 《Clean Architecture》
• 商業邏輯要放在哪裡? Entity Layer 或 Use Case
Layer (Application Service Layer) ?
• Clean Architecture 說
– Entity Layer
• Critical Business Rules
– Use Case Layer
• Application-Specific Business Rules
• 怎麼區分商業邏輯是Critical或Application-Specific?
– It….depends! Orz
• 如何重複使用商業邏輯?
Copyright@2021 Teddysoft
Copyright© 2021 Teddysoft 《Domain-Driven Design: Tackling Complexity in the Heart of Software》
Domain
Events
Ubiquitous
Language
Bounded
Context define model within
names enter
model gives structure to
express model with
Copyright© 2021 Teddysoft
Copyright@2021 Teddysoft
請看瀏覽器
Copyright@2021 Teddysoft
• Data
– 資料類別,原本充血模型類別的演算法被抽離出來放到角色(Role)
– Role是沒有狀態的類別,類似domain service。但在DCI架構中,
Data可以在執行期間動態扮演不同角色
– Data扮演某個Role之後,該Data物件看起來就變成屬於該Role的型別,
可以執行該Role所定義的方法
• Context
– 物件的演算法必須放在一個特定情境(Context)去討論才可知道它
的意義,這個情境就是使用案例
• Interaction
– 使用案例藉由指派若干Data物件扮演不同Role,並控制物件之間的協
作來完成使用案例,稱為互動(Interaction)
Copyright@2021 Teddysoft 《The DCI Architecture by Trygve Reenskaug and James O. Coplien》
DCI為什麼主張在使用案例中
動態決定程式行為的意義? 為
什麼不是把程式行為綁定在
類別身上, 由類別決定?
Copyright@2021 Teddysoft
程式範例
Copyright@2021 Teddysoft
Copyright@2021 Teddysoft
Copyright@2021 Teddysoft
請看IntelliJ
• Step 1: 定義 TeamRoles => Content, Membership,
BoardAccess 與每一個角色需要使用的Data class
• Step 2: 實作 MembershipRole, BoardAccessRole
• Step 3: 重構 Team
– 實作TeamRoles.Content, MembershipRole, BoardAccessRole
– 使用 TeamRoles.TeamData
– 使用 MembershipRole, BoardAccessRole
• Step 4: 重構 Team使其支援角色扮演
– 讓Team繼承DciAggregateRoot
– 修改 use case 測試案例,使用 playRole 來執行程式
• Step 5: 新增角色BoardContentRole並將其動態加入Team
Copyright@2021 Teddysoft 請看IntelliJ
Copyright@2021 Teddysoft
Copyright@2021 Teddysoft
Copyright@2021 Teddysoft
Copyright@2021 Teddysoft
• 有感的好處
– 簡化Aggregate設計、實作與測試
• 真,單一責任
– 依據角色重新排版Event Storming
• 有疑惑的理論好處
– 已經透過Event Storming切割出Task-Based使用
案例(Command),在此情況下是否真的需要DCI
強調的動態扮演不同角色的彈性?
– Task-Based使用案例沒有很複雜的Interaction
Copyright@2021 Teddysoft
Copyright@2021 Teddysoft
Copyright@2021 Teddysoft
• 搞笑談軟工部落格
– http://teddy-chen-tw.blogspot.com
• 搞笑談軟工Facebook
– https://www.facebook.com/groups/teddy.tw
• 泰迪軟體官方網站
– http://teddysoft.tw
Copyright@ 2021 Teddysoft

Dci vs aggregate_dddtw_2021-0.3-preview