2019-02-20-ddd taiwan-community-iddd-studygroup-1st

kimKao 1,282 views 43 slides Feb 20, 2019
Slide 1
Slide 1 of 43
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26
Slide 27
27
Slide 28
28
Slide 29
29
Slide 30
30
Slide 31
31
Slide 32
32
Slide 33
33
Slide 34
34
Slide 35
35
Slide 36
36
Slide 37
37
Slide 38
38
Slide 39
39
Slide 40
40
Slide 41
41
Slide 42
42
Slide 43
43

About This Presentation

Guide attendees to learn from iDDD Ch1. Know why and how to judge apply DDD or not. Also introduced explict business intention is the way to decrease the gap between Domain Experts and Team


Slide Content

© 2019, Domain Driven Design Taiwan Community
Kim Kao ( )
Feb 20, 2019
Getting started with DDD

© 2019, Domain Driven Design Taiwan Community
0-<WP*!
•Pattern Name (#): R,@5(R4!, 'G ,#VK<
YFM% O$K8&R4!
•Bounded Context(2): RJ>@?=X+Bounded
Context<D
•Bounded Context : J>Bounded ContextE0?A:S
.65UCZJ>
•[reference] : F)9
•[Evans]: FIEric Evans<E-B<
•[Evans, Ref]: T<QM7HR7/";Evans-B
•[Gamma et al.],[Fowler, PoEAA]: ";<NL4!Martin
Fowler<213NL4!

© 2019, Domain Driven Design Taiwan Community

/.
Strategic Design
:?>, =%,
@7–Ch4
-'98$<0!
PoEAA, EIP, RESTful, CQRS, Event Driven
Tactical Design Pattern
+); ,98
(Entity, Value Object, Repository .......)
63200310, *1DDD'
>: 24#"
Aggregate + Event Sourcing
&

5
6(

© 2019, Domain Driven Design Taiwan Community

•"
•Pair Mob programming

•!
•https://github.com/ddd-tw
/.
Strategic Design
:?>, =%,
@7–Ch4
-'98$<0!
PoEAA,EIP,RESTful, CQRS, Event Driven
TacticalDesignPattern
+); ,98
(Entity,ValueObject,Repository.......)
63200310, *1DDD'
>: 24#"
Aggregate + Event Sourcing
&

5
6(

© 2019, Domain Driven Design Taiwan Community
DDD"
•&$#(UbiquitosLanguage) –&$# '
(Bounded Context,2)
•)
•1stmeetup : , %!, $,
•: (&$#

© 2019, Domain Driven Design Taiwan Community
(Strategic Modeling)

© 2019, Domain Driven Design Taiwan Community
Ch1 –DDD<
2:@
•7DDD*)4= 5
•.8-)'9$,DDD
•7!1-DDD(&)3?-
•2DDD/
•20+=,>,#6=%";DDD
DDD

© 2019, Domain Driven Design Taiwan Community
DDD
<!-,
( /.+7?09?@
6465*A%
DDD.WhirlPool; .&2
'?$.3"> )8.#=: 1

© 2019, Domain Driven Design Taiwan Community
I"LM@>
•1!9(X), ?D(O) 46(O) *<(O) -)(O)
•FC,!9B=./IJ2
•($L!? !?
•L#5'% ;8:#
0EAK&.G#L
•7#+.@>3 3H

© 2019, Domain Driven Design Taiwan Community

© 2019, Domain Driven Design Taiwan Community

© 2019, Domain Driven Design Taiwan Community

© 2019, Domain Driven Design Taiwan Community

4 %4'/
14 12$ &
0$+,#*
"(-3.'!)

© 2019, Domain Driven Design Taiwan Community
860DDD
•` ]>HT$:BLZ52_8IN_MVX
GS6WJ..
•%5-b7:94` 'E<HAY)4?5
2IN@F
•!0AR?^! BUaAR1,."/*
•+
•Job security
•($*SASA, SD21SD, 5#,$!
•.$7,"UML )%"
•D&C#1QPQP#1D&C
•+
•Living Document
•3-$'&/421
•(=QP%<O+3\M(KQP%;[

© 2019, Domain Driven Design Taiwan Community
DDD
•-.@0<+
•=(&*
•89)165'
•4?3 :/

•UML ( )
• (HA, Cloud)
•DDD
•7!%;3,&#
•"$,
•2>A,&#

© 2019, Domain Driven Design Taiwan Community
dDDD| à{\y?&??)
5WY^>~ f
K
5W1KI`?#zCRUD!$1@?
?zDDD
0no?r??CRUD1@0y?<?z"*
L
no#T25~30H! ,Y7PS+30
User StoryAUse Case Flow
1CfPS+30XM_
noT30~40fUser StoryAUse
Case Flow
2?:y?k<3O/xeb
b(h?y?=%?31.-Vxz[Ry?fr?wi9p?.?
>y?CRUD$ra_1Juc
2.`NTfr]?$E}f?b($r
P??y?
??rF4L?qa_?U? ?
Pm'Ay?
4DDD$;lc??fy?<?tQ?Gj
$6?v?Z
]T{Bz{\f&??)?z}?y?k
<
5?zs?)52?8gFDdDDD
7 DDD

© 2019, Domain Driven Design Taiwan Community
Anemic Domain Model
https://www.mamanatural.com/anemia-during-pregnancy/

© 2019, Domain Driven Design Taiwan Community
;2-1-
•Anemic Domain Object -;2A%
•03)4=.A:
•6!2000@.+ 87
•Java EE, ASP.net,

•& (
•""5?"public getter/setter, ()'#$><?
•""/xxxService,xxxApplication*9
,.A+ 3getter/setter?
All Yes, or All No

© 2019, Domain Driven Design Taiwan Community

package solid.humank.domains;
public class Order {
private intquantity;
private String seatNo;
private booleandrinkHere;
private intprice;
private String itemName;
private String establishTime;
private intdrinktemperature;
}

© 2019, Domain Driven Design Taiwan Community

package solid.humank.domains;
import lombok.Data;
@Data
public class Order {
private intquantity;
private String seatNo;
private booleandrinkHere;
private intprice;
private String itemName;
private String establishTime;
private intdrinktemperature;
}
public intgetQuantity() {
return quantity;
}
public void setQuantity(intquantity) {
this.quantity= quantity;
}
public String getSeatNo() {
return seatNo;
}
public void setSeatNo(String seatNo) {
this.seatNo= seatNo;
}
•% #&Getter/Setter(Accessor/Mutator)
•Getter/Setter"'
•$à
• !/
•”(”!/

© 2019, Domain Driven Design Taiwan Community
;9*3
•2C–B*'7%@5A:80B*
#"!*(O-R Mapping)(.,)
?=/$4-<
•B*6"!3#
•xxxService, xxxApplication)?=
•>+$ Active Record *[Folwer,PoEAA]
•& 1
•[Fowler,PoEAA] 3Transaction Script*

© 2019, Domain Driven Design Taiwan Community
Transaction Script
• ()

© 2019, Domain Driven Design Taiwan Community
Martin Fowler
1) %
$"
2)GoFCommand Pattern
%#
! :https://bit.ly/2NfZYlH

© 2019, Domain Driven Design Taiwan Community
Transaction Script
?
•saveCustomer?
•(?)

© 2019, Domain Driven Design Taiwan Community

</?
• &:( 75*
•.+.+
•$-8#6-
'"=
!)2%3*09
Customer#;,
#14>

© 2019, Domain Driven Design Taiwan Community
-1
Patient.setShotType(ShotTypes.TYPE_FLU);
Patient.setDose(dose);//
Patient.setNurse(nurse);
:
No comment from DE
•PatientsetNurse?
•Patient ShotType
• ?

© 2019, Domain Driven Design Taiwan Community
-2
Patient.giveFluShot(); ! :
“”
•?

© 2019, Domain Driven Design Taiwan Community
-3
Vaccine vaccine = Vaccines.standardAdultFluDose();
nurse.administerFluVaccine(patient, vaccine);
*&: "
“% (!"”

•$#)
•'!?

© 2019, Domain Driven Design Taiwan Community
"M#9C%2
•@5GlossaryFO! +GO7<C)
=7“6A('”
•HJUMLI;3H&8BMK:4>
•50$/087 .=3H
•*NL7-,2
•Wiki
•1/7Sprint planning>D?E
•Code Base

© 2019, Domain Driven Design Taiwan Community
Customer

© 2019, Domain Driven Design Taiwan Community

public interface Customer {
public void changePersonalName(String firstName, String lastName);
public void postalAddress(PostalAddresspostalAddress);
public void relocateTo(PostalAddresschangedPostalAddress);
public void changeHomeTelephone(Telephone telephone);
public void disconnectHomeTelephone();
public void changeMobileTelephone(Telephone telephone);
public void disconnectMobileTelephone();
public void primaryEmailAddress(EmailAddressemailAddress);
public void secondaryEmailAddress(Email Address);
}

•String àPostalAddress
•String àTelephone
•EmailString àEmailAddress
•()

© 2019, Domain Driven Design Taiwan Community
C3A@(Ubiquitous Language)FO
•J83>E6M!/
•C3A@>(2&6<:M!A@
•Scope,teammatters
•(Bounded Context)C3A@ G"=
%6Hà:-)>E0CNM!
•I4*:#9176.M!36C3A@
•5L?;6I4*0C,CD*+$
(Context Mapping,3)%B*K'

© 2019, Domain Driven Design Taiwan Community
/DDD2&
•,$/2B(
•&9+#*3278.;
•B+?D=< >-
•#2/DC
•)"2(A0
•#2&%'
• @6(
•/1:!
•#54(Aggregate,10) (Entity,5) (Value Object,6) (Domain Service,7)
(Domain Event 8)

© 2019, Domain Driven Design Taiwan Community
DDD 0$
•,)(&+ .
•!1-'2%
•*/#1"
•? ?

© 2019, Domain Driven Design Taiwan Community
Scrum

© 2019, Domain Driven Design Taiwan Community
Agile / Scrum ?

© 2019, Domain Driven Design Taiwan Community
: Backlog item Sprint
•"
•(0&-'$
backlogsprint
•/.,Client(
•!%$#*+)
scrum team, 1?

© 2019, Domain Driven Design Taiwan Community
/B-37,8?'+
Scrum Team member,
” ”
sprint
A)=":
<( backlog sprint. %1backlog#2
;03.*6!sprint9C&
backlog5 sprint1@DA: . 1
sprint$>4%stakeholders

© 2019, Domain Driven Design Taiwan Community
DDD`JKAM
•c7:h$!<:YP$!O'c
•fEG>h7NK9Z*Vg?<;]7Vg
KHTransaction ScriptidD)"6-%Z
•DDDK/U?(7 NSbI5Ke.
•HTransaction ScriptRB&L_
•8a[C742
•=,h7 1/U#\
• 0R+^@K2QXWS`JF*T
•cR423DDD?

© 2019, Domain Driven Design Taiwan Community
%TDDH
>LG/.W; 40I
•1$:L$!-CA M=W;
•)W; *:LAQRDN
•4':LW; U6?:LA8@72
=-CAEJS5,9
•#O5TPAQR:L'5TPAU6
•VFW&"(BA@+A3<
K,

© 2019, Domain Driven Design Taiwan Community
Kent Beck Simple Design
1. Passes the tests
2. Reveals intention
3. No duplication
4. Fewest elements
TDD
1. Write new code only if an automated test has failed
2. Eliminate duplication

© 2019, Domain Driven Design Taiwan Community
TDD is natural fit in DDD

© 2019, Domain Driven Design Taiwan Community
DDD
•TDD
•Kata -
http://butunclebob.com/ArticleS.UncleBob.TheBowlin
gGameKata
• !
Tags