狠狠撸

狠狠撸Share a Scribd company logo
共筆QRCode
1
DDD with Clean Architecture
軟體架構從0到1
2
什麼是軟體架構?
讓我們先從建築架構說起
3
前導
不論外觀長什麼樣,它還是
星巴克
軟體架構就是你軟體的外觀和長像
4
前導
架構設計是朝向?
功能性需求 非功能性需求
5
前導
軟體架構設計就是朝向非功能性需求
6
前導
為什麼需要做軟體架構設計
7
前導
你應該不想這樣工作…
PM
老闆
老闆的?
8
前導
我希望我能準時下班,每天都可以快快樂樂
工作,每個舊程式碼都能很好改
新年的時候,你是否許過願了
||
好維護
9
前導
軟體架構的目標
“The goal of software architecture is to minimize
the human resources required to build and
maintain the required system.”
Robert C. Martin – Clean Architecture
minimize
10
前導
大綱
11
平衡
12
火車為什麼要有鐵軌?
希望火車越來越快,
但是鐵軌又會讓火車
變慢?兩者似乎是相
互抵觸!
13
平衡
因為你不希望沒有鐵軌的火車
出現在你面前
14
平衡
軟體架構的設計關鍵-架構因子
互通性
可用性
強健性
易用性
擴充性 可攜性
重用性
可靠性
效能
安全性
維護性
可用性
15
平衡
架構因子關聯表
+: 增益
-: 減損
16
平衡
選擇主要的架構因子
1st. 架構因子
2st. 架構因子
3st. 架構因子
團隊經過討論和協調 選出三個標的架構因子
17
平衡
保持平衡-放下你的主見
18
平衡
定期審視架構因子
1st. 架構因子
2st. 架構因子
3st. 架構因子
1st. 架構因子
2st. 架構因子
3st. 架構因子
1st. 架構因子
2st. 架構因子
3st. 架構因子
1st. 架構因子
2st. 架構因子
3st. 架構因子
1st. 架構因子
2st. 架構因子
3st. 架構因子
1st. 架構因子
2st. 架構因子
3st. 架構因子
19
平衡
架構的腐化是難以避免
20
平衡
因為…
21
平衡
你只有很努力…架構才會看起來不廢力
22
平衡
什麼時候決定架構因子?
23
平衡
分層
24
軟體分層架構
請問分層架構的
特性有那些?
什麼!你不知道什麼
是分層架構!
還不快加入DDD社群!
25
分層
分層架構的特性
? 上層僅依賴自己的下一層
? 下一層將運行結果回應給自己上一層
? 不能跨層呼叫
26
分層
為什麼要設計成多層?
27
分層
因為它符合人類的認知
有結構
職責分明
好理解
方便拆解
好上手
範例多
易學習
實現成本
低
28
分層
利於工程化
基於層的分工 基於功能的分工
提高效率,降低成本
29
分層
分層架構的問題?
依賴自己的下一層
30
分層
當你想要替換掉底層….
你
31
分層
控制反轉(Inverse of Control)
32
分層
設計的套路
33
分層
如同大自然的葉子一般,結構都相同,但是長相有差異
你該怎麼設計?
34
分層
作用力
35
Vision Planning Strategy Doing Teamwork Consistency Success
產品/專案歷程
真實世界並不美好
36
作用力
作用力-團隊歷程
形成期
風暴期 規範期 高效期
解散期
形成期 風暴期 規範期 高效期 解散期
團隊狀態
工作績效
時間
37
作用力
你選對了架構異動時機嗎?
38
作用力
作用力-組織
功能性團隊 跨功能團隊
39
作用力
你的組織與架構契合嗎?
40
作用力
作用力-估算
41
作用力
只有在越接近結束的時候,估算才會更準確
你的架構規劃是否只建立在假設上?
42
作用力
作用力-設計歷程
43
作用力
不要放棄持續設計,直到你突然頓悟,
腦袋彷彿重生
44
作用力
45
作用力
什麼是你該做的?
46
作用力
維度
47
回頭思考分層架構
Component +
Layer +
? 一維: Component的擴充
? 二維: Layer的擴充
這兩個維度的思考僅是在
一個系統內
48
維度
真實世界的軟體系統-三維世界
是多個系統一起協作
49
維度
架構設計不僅只有三個維度
50
維度
第四維度-時間
51
維度
隨著時間,狀態會不斷變化
52
維度
Coding很難,狀態管理更難!
53
維度
狀態管理
54
維度
第五維度-驅動系統變化的力量
風險 商業
55
維度
風險-拉姆斯菲爾德 語錄:
未知的已知
已知的已知已知的未知
未知的未知
56
維度
商業-商業模型&軸轉
57
維度
58
維度
59
三個你應該知道的原則
SOLID原則 DRY原則 易變原則
60
心法
SOLID是程式人員的基本道德指南
61
心法
對於DRY你的理解是什麼?
62
心法
先來看看DRY的描述
“Every piece of knowledge must have a single,
unambiguous, authoritative representation
within a system”
Andy Hunt – The Pragmatic Programmer
63
心法
DRY不是要你看到有重複的Code就改…
64
心法
DRY套用準則-限界上下文&通用語言
不同限界上下文有其專屬
的通用語言,並非是重複概念
65
心法
軟體有著易變與不變的特質
66
心法
越貼近I/O,則越容易變動
越富含領域知識,越不容易變動
67
心法
三個近代架構
六角 洋蔥 Clean
Domain Model都在內核
68
心法
如此設計的根本原理就是-相依性
69
心法
相依的真相
不與人相依的模組,受到其它模組干擾的機率=0
70
心法
Clean Architecture分層的觀點
實際上是以核心層(Entities)為最高層
71
心法
利用三步工作法設計核心領域模型
Capture
Embedded
Protect
Capture: 捕捉領域模型
Embedded: 將領域知識套用到程式碼
Protect: 保護領域模型程式碼不被汙染
72
心法
捕捉模型(Capture)-統一語言(1)
? 飛機(Aircraft)離開某個地點(Departure),並抵達目的地(Destination)
? 飛航員會有一份飛行計劃,計劃中會談到航線(Route)
73
心法
捕捉模型(Capture)-統一語言(2)
? 飛航計劃有航線資訊(Route)
? 飛航計劃有停降地點(Departure)
74
心法
捕捉模型(Capture)-統一語言(3)
? 航線有起飛和目的地,還有停靠點(Fix)
? 是否考慮使用3維來描述每個起飛點(3DPoint)
75
心法
捕捉模型(Capture)-統一語言(4)
? 依客戶描述,實際上是以2D描述起飛點(2DPoint)
76
心法
利用統一語言與領域專家互動
77
你說的是這
樣嗎? 差不多了
….
團隊成員 領域專家
用圖像來對話,不要僅用文字和口述
心法
如何組織領域模型的物件?
78
心法
套用DDD的Aggregate模式
79
? 以Aggregate作為邊界
? 每個Aggregate中都由多個關係緊密且互相協作的物件所組成的無閉環圖
? Aggregate必有一個Aggregate Root物件作為Aggregate的封裝
? 所有與Aggregate的互動,皆是直接與Aggregate Root所提供的方法互動
? 外部不能直接與Aggregate內部的物件互動!
心法
Aircraft Route Fix
2DPoint
Flight
Aggregate Root, Entity
Entity Entity Value Object
Value Object
Aggregate: Flight
Aggregate設計準則
80
? 一個Aggregate是一個完整的交易(Transaction)
? 當交易所異動到的資料表過於龐大,會造成效能議題(Issue)
? 適當拆解Aggregate(i.e. 不違反交易ACID規範為前題)
? 考慮採用文件型資料庫(NoSQL)
參考資料
心法
將領域知識相嵌到程式碼中
經由與領域專家討論之後,僅能夠得到領域模型的元素
以及元素之間的關聯性,而最重要的-職責,則無法進行
設計!該怎麼做呢?
81
心法
類別中定義的方法即為職責
82
心法
從商業規則(Business Rule)作為起點
將商業規則,以多個實際的例子來陳述
83
心法
讓測試逼出領域物件的職責
84
心法
保護領域模型-參考Clean Architecture建議
這一塊都是在做模型保護
85
心法
除了核心層之外的其它層設計方法?
86
心法
設計的關鍵概念- Port and Adapter
87
心法
與DDD戰術的結合
88
心法
兩者結合的實際例子
89
心法
讓你的架構更平易近人-Use Case
90
從架構和Folder就像文件一樣描述這個系統
心法
Clean Architecture的Use Case交互物件
91
個人觀點
? Clean Architecture中的Use Case物件旨在: 為了完成某個商業目標而指導協作多個
Entity的資料處理流程。
? 其概念與流程控制的Controller極為相似,但是在Clean Architecture書中的概念圖中,可
以觀察到Controller似乎與Use Case交互物件並不相同。
? 在推敲下有一個可能,Use Case交互物件:
即為PoEAA書中針對商業邏輯層設計的-Transaction Script
? PoEAA的商業邏輯層設計並非是零和遊戲,亦即可以讓多個一起協作互動,而
Clean Architecture即是合併: Transaction Script與Rich Model
“These use cases orchestrate the flow of data to and from the entities,
and direct those entities to use their Critical Business Rules to achieve the goals of the use case.”
-- Clean Architecture
心法
完整的例子
92
心法
建議套用Clean Architecture的地方
93
核心子領域
(Core Subdomain)
支持子領域
(Supporting Subdomain)
支持子領域
(Supporting Subdomain)
通用子領域
(General Subdomain)
問題域(Problem Domain)
套用Clean Architecture
的成本,真的太高了!
(英文字幕)I need DDD community
心法
要怎麼說服團隊接受Clean Architecture +
DDD?
94
心法
95
96
模式
架構模式(Pattern)
An architectural pattern is a general, reusable solution to a commonly occurring problem in
software architecture within a given context. Architectural patterns are often documented as
software design patterns.
Following traditional building architecture, a ‘software architectural style’ is a specific method
of construction, characterized by the features that make it notable
-- by Wiki
97
模式
架構樣式(Style)
An architectural style defines: a family of systems in terms of a pattern of structural
organization; a vocabulary of components and connectors, with constraints on
how they can be combined.
Architectural styles are reusable ‘packages’ of design decisions and constraints that are applied
to an architecture to induce chosen desirable qualities.
-- by Wiki
98
模式
兩者的差別
模式 樣式
99
模式
設計樣式的六大基本元素
Name
ContextProblem
Solution Force
Resulting
Context
100
模式
Recap
? 架構的品質因子選三個作為設計的方向
? 分層架構的知識是架構設計的根本
? 作用力影響著架構設計的決策
? 提高思考維度,讓架構完備度更高
? 領域模型設計三步工作法: (CEP)
Capture + Embedded + Protect
? 架構模式與樣式兩者是不同的
? 內聚力理論指引元件/服務拆分之道
101
延遲你的決策,直到你已經準備好
102

More Related Content

What's hot (20)

PDF
20180914 security iotlt#1_ほんとうにあった怖い話_aws_iot編
Tatsuya (達也) Katsuhara (勝原)
?
PDF
ソースコードの品质向上のための効果的で効率的なコードレビュー
Moriharu Ohzu
?
PDF
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
Koichiro Matsuoka
?
PDF
ドメイン駆動設計 の 実践 Part3 DDD
増田 亨
?
PDF
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
京大 マイコンクラブ
?
PDF
LEANSTARTUPアンチパターン #devlove #leanstartup
Itsuki Kuroda
?
PDF
ソフトウェア設計における 意思決定とそのレビューの秘訣
Yoshitaka Kawashima
?
PDF
RDRA DDD Agile
増田 亨
?
PDF
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Koichiro Matsuoka
?
PDF
ドメインオブジェクトの设计ガイドライン
増田 亨
?
PDF
實踐 Clean Architecture(實作高可用性的軟件架構)
Gelis Wu
?
PDF
3週連続DDDその3 ドメイン駆動設計 戦略的設計
増田 亨
?
PPTX
ドメイン駆动设计の学习曲线とブレークポイント
増田 亨
?
PDF
ドメイン駆动设计に15年取り组んでわかったこと
増田 亨
?
PDF
ブラック公司から学ぶ惭痴颁モデル
Yuta Hiroto
?
PPTX
9コマシナリオの使い方
Mayumi Okusa
?
PDF
モジュールの凝集度?结合度?インタフェース
Hajime Yanagawa
?
PDF
マイクロにしすぎた结果がこれだよ!
mosa siru
?
PDF
日経BPリーン式創業塾 #leanstartup #リーンスタートアップ
Itsuki Kuroda
?
PDF
いまなぜドメイン駆动设计か
増田 亨
?
20180914 security iotlt#1_ほんとうにあった怖い話_aws_iot編
Tatsuya (達也) Katsuhara (勝原)
?
ソースコードの品质向上のための効果的で効率的なコードレビュー
Moriharu Ohzu
?
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
Koichiro Matsuoka
?
ドメイン駆動設計 の 実践 Part3 DDD
増田 亨
?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
京大 マイコンクラブ
?
LEANSTARTUPアンチパターン #devlove #leanstartup
Itsuki Kuroda
?
ソフトウェア設計における 意思決定とそのレビューの秘訣
Yoshitaka Kawashima
?
RDRA DDD Agile
増田 亨
?
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Koichiro Matsuoka
?
ドメインオブジェクトの设计ガイドライン
増田 亨
?
實踐 Clean Architecture(實作高可用性的軟件架構)
Gelis Wu
?
3週連続DDDその3 ドメイン駆動設計 戦略的設計
増田 亨
?
ドメイン駆动设计の学习曲线とブレークポイント
増田 亨
?
ドメイン駆动设计に15年取り组んでわかったこと
増田 亨
?
ブラック公司から学ぶ惭痴颁モデル
Yuta Hiroto
?
9コマシナリオの使い方
Mayumi Okusa
?
モジュールの凝集度?结合度?インタフェース
Hajime Yanagawa
?
マイクロにしすぎた结果がこれだよ!
mosa siru
?
日経BPリーン式創業塾 #leanstartup #リーンスタートアップ
Itsuki Kuroda
?
いまなぜドメイン駆动设计か
増田 亨
?

Similar to Ddd(meetup 2) ddd with clean architecture (20)

PDF
从零开始做架构图
Philip Zheng
?
PPTX
团队协作实战顿顿顿
Jed Lin
?
PPTX
从混乱到组织:顿顿顿与颁础持续精进挑战之道
Steny Liu
?
PPTX
DDD x Architecture
Clark
?
PPTX
Visual studio 2010 塑模化應用程式講座v4
Gelis Wu
?
PDF
软体架构模式
Chieh (Jack) Yu
?
PPT
教学投影片01冲痴产2005
洋夫 葉
?
PPTX
哥寫的不是程式,是軟體 - 從嵌入式系統看軟體工程全貌
Tun-Yu Chang
?
PPT
Ch1
dreamy318
?
PPT
OOAD
shiyanyong
?
PDF
2012 May UiGathering: Design and Communication in Co-creation (by Ian Jang)
Ian Jang
?
PPTX
Joel on Software 中文版 Ch13-18
Jiun-Tang Huang
?
PPTX
開放原始碼 Ch2.3 app - oss - ui framewoks (ver 1.0)
My own sweet home!
?
PDF
Modern Web Architecture Design Journey
Yi-Feng Tzeng
?
PDF
20120524 App開發流程與小工具分享@UI Cafe
Justin Lee
?
PPTX
类别图实习
Shang-Pin Ma
?
PPT
CBAP 技術交流 20151008
moris lee
?
PDF
Let's talk about Web Design
Abby Chiu
?
DOC
物件导向设计原理及设计样式
Y YU
?
PDF
软体又热又平又挤:浅谈开放原始码软体衝击下的新思维
National Cheng Kung University
?
从零开始做架构图
Philip Zheng
?
团队协作实战顿顿顿
Jed Lin
?
从混乱到组织:顿顿顿与颁础持续精进挑战之道
Steny Liu
?
DDD x Architecture
Clark
?
Visual studio 2010 塑模化應用程式講座v4
Gelis Wu
?
软体架构模式
Chieh (Jack) Yu
?
教学投影片01冲痴产2005
洋夫 葉
?
哥寫的不是程式,是軟體 - 從嵌入式系統看軟體工程全貌
Tun-Yu Chang
?
2012 May UiGathering: Design and Communication in Co-creation (by Ian Jang)
Ian Jang
?
Joel on Software 中文版 Ch13-18
Jiun-Tang Huang
?
開放原始碼 Ch2.3 app - oss - ui framewoks (ver 1.0)
My own sweet home!
?
Modern Web Architecture Design Journey
Yi-Feng Tzeng
?
20120524 App開發流程與小工具分享@UI Cafe
Justin Lee
?
类别图实习
Shang-Pin Ma
?
CBAP 技術交流 20151008
moris lee
?
Let's talk about Web Design
Abby Chiu
?
物件导向设计原理及设计样式
Y YU
?
软体又热又平又挤:浅谈开放原始码软体衝击下的新思维
National Cheng Kung University
?
Ad

More from 國昭 張 (20)

PPTX
8th ddd taiwan study group bounded context integration
國昭 張
?
PPTX
20190126 ddd-meetup1
國昭 張
?
PPTX
事件风暴-设计衝刺
國昭 張
?
PPTX
单元测试
國昭 張
?
PPTX
顿辞肠办别谤实务
國昭 張
?
PPTX
Scrum essential
國昭 張
?
PPTX
顿辞肠办别谤进阶探讨
國昭 張
?
PPTX
Vue
國昭 張
?
PPTX
顿辞肠办别谤基础
國昭 張
?
PPTX
顿顿顿系统分析
國昭 張
?
PPTX
顿顿顿引导
國昭 張
?
PPTX
前端测试
國昭 張
?
PPTX
Asp.net core v1.0
國昭 張
?
PPTX
Redux+react js
國昭 張
?
PPTX
React js
國昭 張
?
PPTX
架构设计-资料存取的选择
國昭 張
?
PPTX
前端自动化工具
國昭 張
?
PPTX
例外處理與单元测试
國昭 張
?
PPTX
ASP.Net WebAPI經驗分享
國昭 張
?
PPTX
ASP.Net MVC Framework
國昭 張
?
8th ddd taiwan study group bounded context integration
國昭 張
?
20190126 ddd-meetup1
國昭 張
?
事件风暴-设计衝刺
國昭 張
?
单元测试
國昭 張
?
顿辞肠办别谤实务
國昭 張
?
Scrum essential
國昭 張
?
顿辞肠办别谤进阶探讨
國昭 張
?
顿辞肠办别谤基础
國昭 張
?
顿顿顿系统分析
國昭 張
?
顿顿顿引导
國昭 張
?
前端测试
國昭 張
?
Asp.net core v1.0
國昭 張
?
Redux+react js
國昭 張
?
React js
國昭 張
?
架构设计-资料存取的选择
國昭 張
?
前端自动化工具
國昭 張
?
例外處理與单元测试
國昭 張
?
ASP.Net WebAPI經驗分享
國昭 張
?
ASP.Net MVC Framework
國昭 張
?
Ad

Ddd(meetup 2) ddd with clean architecture