SlideShare a Scribd company logo
1 of 38
Download to read offline
Teddy Chen
teddy@teddysoft.tw
http://teddy-chen-tw.blogspot.tw/
Oct. 16 2021 @ DDD TW
• 聽過DDD請舉手
• 實作過DDD請舉手
• 聽過DCI請舉手
• 實作過DCI請舉手
• 以上皆是請舉手
• 土豆
• 勉強
• OK
1. 事 物 的 意 義 , 須 放 在 特 定
Context 之下討論才有意義
2. 相 同 概 念 ( 名 詞 ), 在 不 同
Context之下可能有不同意義
《ezKanban》
Bounded Context裡面有什麼?
《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
《ezKanban》
貧血好還是充血好?
傳統物件導向觀點認為
充血模型比貧血模型好
DDD的領域模型是
貧血還是充血模型?
• Context決定意義
• 常見的DDD Context有:
–Bounded Context
–Domain Model裡面的類別→相當於Clean
Architecture的Entities Layer
• DDD的Domain Model通常屬於充血模型
Use Case是一種Context嗎?
DDD有提到Use Case嗎?
《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
《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
• 如何重複使用商業邏輯?
《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
請看瀏覽器
• 在DDD中,Bounded Context內的系統行為(商業邏
輯) 分散在不同階層的不同物件身上
• Aggregate Root的public method相當於一個小型的
使用案例 (task-based use case)
• 因此, Aggregate Root相當於一組task-based use
cases的集合, 可能導致:
–程式碼太多?
–違反單一責任原則?
• Data
– 資料類別,原本充血模型類別的演算法被抽離出來放到角色(Role) 。
– Role是沒有狀態的類別,類似domain service。但在DCI架構中,Data可以在執行期間動
態扮演不同角色。
– Data扮演某個Role之後,該Data物件看起來就變成屬於該Role的型別,可以執行該Role所
定義的方法。
• Context
– 物件的演算法必須放在一個特定情境(Context)去討論才可知道它的意義,這個情境就是
使用案例。
• Interaction
– 使用案例藉由指派若干Data物件扮演不同Role,並控制物件之間的協作來完成使用案例,
稱為互動(Interaction)。
《The DCI Architecture by Trygve Reenskaug and James O. Coplien》
DCI為什麼主張在使用案例中動
態決定程式行為的意義? 為什麼
不是把程式行為綁定在類別身上,
由類別決定?
程式範例 (下頁)
請看IntelliJ
• Step 1: 定義 TeamRoles
– Content, Membership, BoardAccess 與其所使用的Data class
• Step 2: 實作 MembershipRole, BoardAccessRole
• Step 3: 重構 Team
– 實作 TeamRoles.Content, MembershipRole, BoardAccessRole 介面
– 使用 TeamRoles.TeamData
– 使用 MembershipRole, BoardAccessRole instances
• Step 4: 重構 Team 支援角色扮演
– 讓Team繼承DciAggregateRoot
– 修改 use case 測試案例,使用 playRole 來執行程式
• Step 5: 新增角色BoardContentRole並將其動態加入Team
請看IntelliJ
• 充血模型是富人的貧血模型
• 貧血模型是富人的充血模型
< http://teddy-chen-tw.blogspot.com/2021/09/22.html >
• 有感的好處
– 簡化Aggregate設計、實作與測試
• 真,單一責任
– 依據角色重新排版Event Storming
• 有疑惑的理論好處
– 已經透過Event Storming切割出Task-Based使用案例
(Command),在此情況下是否真的需要DCI強調的動態扮
演不同角色的彈性?
– 透過Domain Event達到跨Aggregate的狀態最終一致性,
因此Task-Based使用案裡面並沒有很複雜的Interaction
• 後續探討議題
–DCI動態指派角色的特性是否與Aggregate Root定義衝突?
• Business operations, stage machines, transaction
boundaries, aggregate invariants, return immutable entities
to its callers
• Event sourcing
–不同程式語言實作方法與效能問題
–Business Rules 放在Entities Layer or Use Case Layers?
(下一頁)
• Context決定意義
• DDD中的「靜態」Contexts
– Bounded Context
– Domain Model: Entity, Value Object, Aggregate, Service
• DCI藉由在Context (使用案例) 中動態指派角色給資料類別
達到提升程式可讀性與重複使用性的目的
• 程式範例
– https://gitlab.com/TeddyChen/dci-demo
• 搞笑談軟工Facebook
– https://www.facebook.com/groups/teddy.tw
• 搞笑談軟工部落格
– http://teddy-chen-tw.blogspot.com
• 泰迪軟體官方網站
– http://teddysoft.tw

More Related Content

What's hot

From capabilities to services modelling for business-it alignment v.2
From capabilities to services   modelling for business-it alignment v.2From capabilities to services   modelling for business-it alignment v.2
From capabilities to services modelling for business-it alignment v.2
Trond Hjorteland
 
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
Hiroh Satoh
 
模式入門第一堂課: 30分鐘寫出一個模式
模式入門第一堂課: 30分鐘寫出一個模式模式入門第一堂課: 30分鐘寫出一個模式
模式入門第一堂課: 30分鐘寫出一個模式
teddysoft
 

What's hot (20)

ドメイン駆動設計再入門
ドメイン駆動設計再入門ドメイン駆動設計再入門
ドメイン駆動設計再入門
 
ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8
ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8
ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8
 
DDDオンライン勉強会#2 「集約・境界付けられたコンテキスト」
DDDオンライン勉強会#2 「集約・境界付けられたコンテキスト」 DDDオンライン勉強会#2 「集約・境界付けられたコンテキスト」
DDDオンライン勉強会#2 「集約・境界付けられたコンテキスト」
 
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのかDDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
 
ドメイン駆動設計 分析しながら設計する
ドメイン駆動設計 分析しながら設計するドメイン駆動設計 分析しながら設計する
ドメイン駆動設計 分析しながら設計する
 
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)「実践ドメイン駆動設計」 から理解するDDD (2018年11月)
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)
 
From capabilities to services modelling for business-it alignment v.2
From capabilities to services   modelling for business-it alignment v.2From capabilities to services   modelling for business-it alignment v.2
From capabilities to services modelling for business-it alignment v.2
 
這些年,我寫 Angular 時所使用的小技巧
這些年,我寫 Angular 時所使用的小技巧這些年,我寫 Angular 時所使用的小技巧
這些年,我寫 Angular 時所使用的小技巧
 
リッチなドメインモデル 名前探し
リッチなドメインモデル 名前探しリッチなドメインモデル 名前探し
リッチなドメインモデル 名前探し
 
ハードコア デバッギング : サポート直伝! Windows カーネルモード デバッグ活用編!!
ハードコア デバッギング : サポート直伝! Windows カーネルモード デバッグ活用編!!ハードコア デバッギング : サポート直伝! Windows カーネルモード デバッグ活用編!!
ハードコア デバッギング : サポート直伝! Windows カーネルモード デバッグ活用編!!
 
組み込みLinuxでのGolangのススメ
組み込みLinuxでのGolangのススメ組み込みLinuxでのGolangのススメ
組み込みLinuxでのGolangのススメ
 
Pattern based problem solving-published
Pattern based problem solving-publishedPattern based problem solving-published
Pattern based problem solving-published
 
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
 
大規模微服務導入 - #1, 從零開始的系統架構設計概觀
大規模微服務導入 - #1, 從零開始的系統架構設計概觀大規模微服務導入 - #1, 從零開始的系統架構設計概觀
大規模微服務導入 - #1, 從零開始的系統架構設計概觀
 
從零開始做架構圖
從零開始做架構圖從零開始做架構圖
從零開始做架構圖
 
いつやるの?Git入門
いつやるの?Git入門いつやるの?Git入門
いつやるの?Git入門
 
【さくらのクラウド】DNSアプライアンス導入ガイド
【さくらのクラウド】DNSアプライアンス導入ガイド【さくらのクラウド】DNSアプライアンス導入ガイド
【さくらのクラウド】DNSアプライアンス導入ガイド
 
ブルックスのいう銀の弾丸とは何か?
ブルックスのいう銀の弾丸とは何か?ブルックスのいう銀の弾丸とは何か?
ブルックスのいう銀の弾丸とは何か?
 
リーンなコードを書こう:実践的なオブジェクト指向設計
リーンなコードを書こう:実践的なオブジェクト指向設計リーンなコードを書こう:実践的なオブジェクト指向設計
リーンなコードを書こう:実践的なオブジェクト指向設計
 
模式入門第一堂課: 30分鐘寫出一個模式
模式入門第一堂課: 30分鐘寫出一個模式模式入門第一堂課: 30分鐘寫出一個模式
模式入門第一堂課: 30分鐘寫出一個模式
 

Similar to Dci vs aggregate_dddtw_2021-0.3-16-9

Big Data, NoSQL, and MongoDB
Big Data, NoSQL, and MongoDBBig Data, NoSQL, and MongoDB
Big Data, NoSQL, and MongoDB
Monster Supreme
 
開放原始碼 Ch2.4 app - oss - db (ver 1.0)
開放原始碼 Ch2.4   app - oss - db (ver 1.0)開放原始碼 Ch2.4   app - oss - db (ver 1.0)
開放原始碼 Ch2.4 app - oss - db (ver 1.0)
My own sweet home!
 
深入学习Mongo db
深入学习Mongo db深入学习Mongo db
深入学习Mongo db
Lucien Li
 
使用Dsl改善软件设计
使用Dsl改善软件设计使用Dsl改善软件设计
使用Dsl改善软件设计
mingjin
 

Similar to Dci vs aggregate_dddtw_2021-0.3-16-9 (20)

Json ld 簡介
Json ld 簡介Json ld 簡介
Json ld 簡介
 
Big Data, NoSQL, and MongoDB
Big Data, NoSQL, and MongoDBBig Data, NoSQL, and MongoDB
Big Data, NoSQL, and MongoDB
 
Sequoia db 技术概述_sacc
Sequoia db 技术概述_saccSequoia db 技术概述_sacc
Sequoia db 技术概述_sacc
 
Entities in DCPS (DDS)
Entities in DCPS (DDS)Entities in DCPS (DDS)
Entities in DCPS (DDS)
 
開放原始碼 Ch2.4 app - oss - db (ver 1.0)
開放原始碼 Ch2.4   app - oss - db (ver 1.0)開放原始碼 Ch2.4   app - oss - db (ver 1.0)
開放原始碼 Ch2.4 app - oss - db (ver 1.0)
 
ElasticSearch Introduction
ElasticSearch IntroductionElasticSearch Introduction
ElasticSearch Introduction
 
Entities in DCPS (DDS)
Entities in DCPS (DDS)Entities in DCPS (DDS)
Entities in DCPS (DDS)
 
2020 11-27 Taiwan DDD Conference
2020 11-27 Taiwan DDD Conference2020 11-27 Taiwan DDD Conference
2020 11-27 Taiwan DDD Conference
 
Metadata and Interoperability
Metadata and InteroperabilityMetadata and Interoperability
Metadata and Interoperability
 
Dpl in action
Dpl in actionDpl in action
Dpl in action
 
hibernate
hibernatehibernate
hibernate
 
语义互操作与关联数据
语义互操作与关联数据语义互操作与关联数据
语义互操作与关联数据
 
数据库系统设计漫谈
数据库系统设计漫谈数据库系统设计漫谈
数据库系统设计漫谈
 
深入学习Mongo db
深入学习Mongo db深入学习Mongo db
深入学习Mongo db
 
DDD引導
DDD引導DDD引導
DDD引導
 
使用Dsl改善软件设计
使用Dsl改善软件设计使用Dsl改善软件设计
使用Dsl改善软件设计
 
Azure Data Lake 簡介
Azure Data Lake 簡介Azure Data Lake 簡介
Azure Data Lake 簡介
 
Excel VBA
Excel VBAExcel VBA
Excel VBA
 
賽門鐵克 Storage Foundation 6.0 簡報
賽門鐵克 Storage Foundation 6.0 簡報賽門鐵克 Storage Foundation 6.0 簡報
賽門鐵克 Storage Foundation 6.0 簡報
 
No sql
No sqlNo sql
No sql
 

More from teddysoft

從五個小故事看敏捷開發精神
從五個小故事看敏捷開發精神從五個小故事看敏捷開發精神
從五個小故事看敏捷開發精神
teddysoft
 
Design Patterns這樣學就會了:入門班 Day1 教材
Design Patterns這樣學就會了:入門班 Day1 教材Design Patterns這樣學就會了:入門班 Day1 教材
Design Patterns這樣學就會了:入門班 Day1 教材
teddysoft
 

More from teddysoft (20)

Dci vs aggregate_dddtw_2021-0.3-preview
Dci vs aggregate_dddtw_2021-0.3-previewDci vs aggregate_dddtw_2021-0.3-preview
Dci vs aggregate_dddtw_2021-0.3-preview
 
Agile the timeless way of software development-2019-05-17-v1.2-published
Agile the timeless way of software development-2019-05-17-v1.2-publishedAgile the timeless way of software development-2019-05-17-v1.2-published
Agile the timeless way of software development-2019-05-17-v1.2-published
 
從Bowling Game Kata看敏捷開發
從Bowling Game Kata看敏捷開發從Bowling Game Kata看敏捷開發
從Bowling Game Kata看敏捷開發
 
當Scrum遇到Pattern
當Scrum遇到Pattern當Scrum遇到Pattern
當Scrum遇到Pattern
 
說出一嘴好設計 1.1
說出一嘴好設計 1.1說出一嘴好設計 1.1
說出一嘴好設計 1.1
 
跟著Teddy讀Pattern
跟著Teddy讀Pattern跟著Teddy讀Pattern
跟著Teddy讀Pattern
 
洗白你的軟體架構
洗白你的軟體架構洗白你的軟體架構
洗白你的軟體架構
 
如何學好設計模式
如何學好設計模式如何學好設計模式
如何學好設計模式
 
Bdd atdd sbe_tdd_ddd_published
Bdd atdd sbe_tdd_ddd_publishedBdd atdd sbe_tdd_ddd_published
Bdd atdd sbe_tdd_ddd_published
 
重構三兩事
重構三兩事重構三兩事
重構三兩事
 
了解模式讓你更敏捷 (C C Agile 活動分享)
了解模式讓你更敏捷 (C C Agile 活動分享)了解模式讓你更敏捷 (C C Agile 活動分享)
了解模式讓你更敏捷 (C C Agile 活動分享)
 
從五個小故事看敏捷開發精神
從五個小故事看敏捷開發精神從五個小故事看敏捷開發精神
從五個小故事看敏捷開發精神
 
軟體開發成功的秘訣
軟體開發成功的秘訣軟體開發成功的秘訣
軟體開發成功的秘訣
 
[演講] Scrum導入經驗分享
[演講] Scrum導入經驗分享[演講] Scrum導入經驗分享
[演講] Scrum導入經驗分享
 
那一夜我們說Pattern design patterns 20周年-published
那一夜我們說Pattern design patterns 20周年-published那一夜我們說Pattern design patterns 20周年-published
那一夜我們說Pattern design patterns 20周年-published
 
好設計如何好 @ C.C. Agile #14
好設計如何好 @ C.C. Agile #14好設計如何好 @ C.C. Agile #14
好設計如何好 @ C.C. Agile #14
 
[教材] 例外處理設計與重構實作班201309
[教材] 例外處理設計與重構實作班201309[教材] 例外處理設計與重構實作班201309
[教材] 例外處理設計與重構實作班201309
 
Design Patterns這樣學就會了:入門班 Day1 教材
Design Patterns這樣學就會了:入門班 Day1 教材Design Patterns這樣學就會了:入門班 Day1 教材
Design Patterns這樣學就會了:入門班 Day1 教材
 
搞懂Java例外處理的難題:Checked與Unchecked Exceptions不再是問題
搞懂Java例外處理的難題:Checked與Unchecked Exceptions不再是問題搞懂Java例外處理的難題:Checked與Unchecked Exceptions不再是問題
搞懂Java例外處理的難題:Checked與Unchecked Exceptions不再是問題
 
Java 例外處理壞味道與重構技術
Java 例外處理壞味道與重構技術Java 例外處理壞味道與重構技術
Java 例外處理壞味道與重構技術
 

Dci vs aggregate_dddtw_2021-0.3-16-9