Fast jedes Softwaresystem wird mit guten Vorsätzen aber unter schwierigen Bedingungen entwickelt: Knappe Zeitvorgaben zwingen uns, schnelle Lösungen – Hacks – zu programmieren. Unterschiedliche Qualifikationen im Entwicklungsteam führen zu Code in ebenso unterschiedlicher Güte. Alter Code, den keiner mehr kennt, muss angepasst werden und vieles mehr. All das führt zu schlechtem, verknäultem Code, dem sogenannten Monolithen, der die Entwicklungskosten in Zukunft in die Höhe treibt und den Entwicklungsteams schlaflose Nächte bereitet. Mit Domain-Driven Design haben wir ein Werkzeug an der Hand, um solche Monolithen Schritt für Schritt zu zerlegen und wieder in den Bereich der beherrschbaren Wartungskosten zu bringen.
8. 24.01.2019 //// Seite 12WPS - Workplace Solutions GmbH
MODULARITY MATURITY INDEX (MMI)
612.869 LOC
14.756.435 LOC
252.062 LOC
804.093 LOC
543.388 LOC
1.035.668 LOC
486.358 LOC
175.258 LOC
42.311 LOC
193.383 LOC
643.466 LOC
245.754 LOC
2.890.204 LOC
141.696 LOC
512.086 LOC
9.988.363 LOC
200.591 LOC
922.949 LOC
22.658 LOC
663.862 LOC
3.270.188 LOC
1.521.357 LOC
0
2
4
6
8
10
15. 24.01.2019 //// Seite 19WPS - Workplace Solutions GmbH
WAS IST DOMAIN-DRIVEN DESIGN?
▪ Eine Herangehensweise an die Entwicklung von Software,
die dafür sorgt, dass die Software tief in der Domäne
verwurzelt ist.
▪ Das gelingt durch die Umsetzung der Ubiquitous Language
in mehreren kontextbezogenen Domänenmodellen
▪ Der Kontext dieser Modelle heißt Bounded Context
Software
Domäne
16. 24.01.2019 //// Seite 20WPS - Workplace Solutions GmbH
LIVING IN A BOX
Setze explizite Grenzen …
▪ Ein Team pro fachlicher Subdomäne
▪ Erhalte die Konsistenz innerhalb der Grenzen
▪ Keine Ablenkung durch äußere Angelegenheiten
→ Freie Gestaltung eines Teilmodells
durch ein Team
▪ Kenne die Restriktionen
▪ Bleibe innerhalb der Modellgrenzen
▪ Arbeite schnell in Deinen Grenzen
17. 24.01.2019 //// Seite 21WPS - Workplace Solutions GmbH
JEDER BOUNDED CONTEXT HAT SEIN EIGENES MODELL
ZIEL:
▪ Jedes Team kann an seinem eigenen Domänen-Modell arbeiten
▪ Man kennt seine Grenzen
▪ Man bleibt in seinen Grenzen
18. 24.01.2019 //// Seite 22WPS - Workplace Solutions GmbH
KLASSISCHES DOMÄNENMODELL – REALITÄT
▪ Mehrere vermischte mentale Modelle
▪ Unbeherrschbare Komplexität
▪ Abhängigkeiten unter den Teams
Foto: CMS Higgs-even/Wikipedia/CC-BY-SA-3.0
23. 24.01.2019 //// Seite 27WPS - Workplace Solutions GmbH
JEDER BOUNDED CONTEXT HAT SEIN EIGENES MODELL
ZIEL:
▪ Jedes Team kann an seinem eigenen Domänen-Modell arbeiten
▪ Man kennt seine Grenzen
▪ Man bleibt in seinen Grenzen
25. 24.01.2019 //// Seite 30WPS - Workplace Solutions GmbH
MODULITH FIRST
▪Ausschneiden eines MS aus einem Monolithen ist nur möglich, wenn
dieser fachliche modularisiert ist
User Interface
Domain
Application
Fachliches
Modul B
Fachliches
Modul A
So wenig Beziehungen wie möglich!
TechnischeSchichtung
Fachliches
Modul C
26. 24.01.2019 //// Seite 32WPS - Workplace Solutions GmbH
WIE SCHNEIDE ICH MEINE DOMÄNE?
▪ Nach Abteilungen in der Organisation bzw. Gruppen von Domänenexperten
▪ Nach Unterschieden in der Verwendung/Definition von Schlüsselkonzepten in der Domäne
▪ Nach Grenzen im Geschäftsprozess, die die Domänenexperten beschreiben
▪ Information läuft in eine Richtung
▪ Prozesse werden in unterschiedlichen
Rhythmen ausgeführt
▪ Prozesse werden von verschiedenen
Triggern ausgelöst.
27. KASSEN-
MITARBEITER
KINO-
BESUCHER
WOCHENPLAN
<< in Arbeit >>
GEWÜNSCHTE
ANZAHL PLÄTZE
SAALPLAN
SAALPLAN-
STAPEL
VERKAUFTE
PLÄTZE
KARTEN
VORSTELLUNG
GEFUNDENE
PLÄTZE
SAALPLAN SAALPLAN
WOCHENPLAN
<< finalisiert >>
VERLEIHER
KINO-
MANAGER
WERBE-
AGENTUR BUCHUNGSPLAN
DER WERBUNG
VORGABEN
FÜR FILME
GESAMTDEUTSCHE
BESUCHERZAHLEN
VERFÜGBARKEIT
VON FILMEN
1
6
2
10
5
3
8
4
7
9
11
12
13
14
SAALPLAN
15
BEGINNT
SEINE ARBEIT
AN DEM
ÜBERPRÜFT
VERHANDELT
MIT
FINALISIERT
DEN
ERZEUGT FÜR DIE
NÄCHSTE WOCHE
GELDSUMME KINOKARTEN
BEZAHLTE
KINOKARTEN
FRAGT NACH
FÜR EINE
ÖFFNET
SCHLIESST
AUS DEM
BIETET
AN BEZAHLT
AN
SUCHT
IM IM
MARKIERT
DRUCKT
AUS
ÜBERGIBT
AN
28. KASSEN-
MITARBEITER
KINO-
BESUCHER
WOCHENPLAN
<< in Arbeit >>
GEWÜNSCHTE
ANZAHL PLÄTZE
SAALPLAN
SAALPLAN-
STAPEL
VERKAUFTE
PLÄTZE
KARTEN
VORSTELLUNG
GEFUNDENE
PLÄTZE
SAALPLAN SAALPLAN
WOCHENPLAN
<< finalisiert >>
VERLEIHER
KINO-
MANAGER
WERBE-
AGENTUR BUCHUNGSPLAN
DER WERBUNG
VORGABEN
FÜR FILME
GESAMTDEUTSCHE
BESUCHERZAHLEN
VERFÜGBARKEIT
VON FILMEN
1
6
2
10
5
3
8
4
7
9
11
12
13
14
SAALPLAN
15
BEGINNT
SEINE ARBEIT
AN DEM
ÜBERPRÜFT
VERHANDELT
MIT
FINALISIERT
DEN
ERZEUGT FÜR DIE
NÄCHSTE WOCHE
GELDSUMME KINOKARTEN
BEZAHLTE
KINOKARTEN
FRAGT NACH
FÜR EINE
ÖFFNET
SCHLIESST
AUS DEM
BIETET
AN BEZAHLT
AN
SUCHT
IM IM
MARKIERT
DRUCKT
AUS
ÜBERGIBT
AN
Trigger
Trigger
29. KASSEN-
MITARBEITER
KINO-
BESUCHER
WOCHENPLAN
<< in Arbeit >>
GEWÜNSCHTE
ANZAHL PLÄTZE
SAALPLAN
SAALPLAN-
STAPEL
VERKAUFTE
PLÄTZE
KARTEN
VORSTELLUNG
GEFUNDENE
PLÄTZE
SAALPLAN SAALPLAN
WOCHENPLAN
<< finalisiert >>
VERLEIHER
KINO-
MANAGER
WERBE-
AGENTUR BUCHUNGSPLAN
DER WERBUNG
VORGABEN
FÜR FILME
GESAMTDEUTSCHE
BESUCHERZAHLEN
VERFÜGBARKEIT
VON FILMEN
1
6
2
10
5
3
8
4
7
9
11
12
13
14
SAALPLAN
15
BEGINNT
SEINE ARBEIT
AN DEM
ÜBERPRÜFT
VERHANDELT
MIT
FINALISIERT
DEN
ERZEUGT FÜR DIE
NÄCHSTE WOCHE
GELDSUMME KINOKARTEN
BEZAHLTE
KINOKARTEN
FRAGT NACH
FÜR EINE
ÖFFNET
SCHLIESST
AUS DEM
BIETET
AN BEZAHLT
AN
SUCHT
IM IM
MARKIERT
DRUCKT
AUS
ÜBERGIBT
AN
Trigger
Einmal pro Woche Trigger
30. KASSEN-
MITARBEITER
KINO-
BESUCHER
WOCHENPLAN
<< in Arbeit >>
GEWÜNSCHTE
ANZAHL PLÄTZE
SAALPLAN
SAALPLAN-
STAPEL
VERKAUFTE
PLÄTZE
KARTEN
VORSTELLUNG
GEFUNDENE
PLÄTZE
SAALPLAN SAALPLAN
WOCHENPLAN
<< finalisiert >>
VERLEIHER
KINO-
MANAGER
WERBE-
AGENTUR BUCHUNGSPLAN
DER WERBUNG
VORGABEN
FÜR FILME
GESAMTDEUTSCHE
BESUCHERZAHLEN
VERFÜGBARKEIT
VON FILMEN
1
6
2
10
5
3
8
4
7
9
11
12
13
14
SAALPLAN
15
BEGINNT
SEINE ARBEIT
AN DEM
ÜBERPRÜFT
VERHANDELT
MIT
FINALISIERT
DEN
ERZEUGT FÜR DIE
NÄCHSTE WOCHE
GELDSUMME KINOKARTEN
BEZAHLTE
KINOKARTEN
FRAGT NACH
FÜR EINE
ÖFFNET
SCHLIESST
AUS DEM
BIETET
AN BEZAHLT
AN
SUCHT
IM IM
MARKIERT
DRUCKT
AUS
ÜBERGIBT
AN
Trigger
Einmal pro Woche
Immer wenn ein
Kunde kommt
Trigger
31. KASSEN-
MITARBEITER
KINO-
BESUCHER
WOCHENPLAN
<< in Arbeit >>
GEWÜNSCHTE
ANZAHL PLÄTZE
SAALPLAN
SAALPLAN-
STAPEL
VERKAUFTE
PLÄTZE
KARTEN
VORSTELLUNG
GEFUNDENE
PLÄTZE
SAALPLAN SAALPLAN
WOCHENPLAN
<< finalisiert >>
VERLEIHER
KINO-
MANAGER
WERBE-
AGENTUR BUCHUNGSPLAN
DER WERBUNG
VORGABEN
FÜR FILME
GESAMTDEUTSCHE
BESUCHERZAHLEN
VERFÜGBARKEIT
VON FILMEN
1
6
2
10
5
3
8
4
7
9
11
12
13
14
SAALPLAN
15
BEGINNT
SEINE ARBEIT
AN DEM
ÜBERPRÜFT
VERHANDELT
MIT
FINALISIERT
DEN
ERZEUGT FÜR DIE
NÄCHSTE WOCHE
GELDSUMME KINOKARTEN
BEZAHLTE
KINOKARTEN
FRAGT NACH
FÜR EINE
ÖFFNET
SCHLIESST
AUS DEM
BIETET
AN BEZAHLT
AN
SUCHT
IM IM
MARKIERT
DRUCKT
AUS
ÜBERGIBT
AN
Trigger
Einmal pro Woche
Immer wenn ein
Kunde kommt
Abteilung
Kinomanagement
Abteilung
Kartenverkauf
Trigger
32. KASSEN-
MITARBEITER
KINO-
BESUCHER
WOCHENPLAN
<< in Arbeit >>
GEWÜNSCHTE
ANZAHL PLÄTZE
SAALPLAN
SAALPLAN-
STAPEL
VERKAUFTE
PLÄTZE
KARTEN
VORSTELLUNG
GEFUNDENE
PLÄTZE
SAALPLAN SAALPLAN
WOCHENPLAN
<< finalisiert >>
VERLEIHER
KINO-
MANAGER
WERBE-
AGENTUR BUCHUNGSPLAN
DER WERBUNG
VORGABEN
FÜR FILME
GESAMTDEUTSCHE
BESUCHERZAHLEN
VERFÜGBARKEIT
VON FILMEN
1
6
2
10
5
3
8
4
7
9
11
12
13
14
SAALPLAN
15
BEGINNT
SEINE ARBEIT
AN DEM
ÜBERPRÜFT
VERHANDELT
MIT
FINALISIERT
DEN
ERZEUGT FÜR DIE
NÄCHSTE WOCHE
GELDSUMME KINOKARTEN
BEZAHLTE
KINOKARTEN
FRAGT NACH
FÜR EINE
ÖFFNET
SCHLIESST
AUS DEM
BIETET
AN BEZAHLT
AN
SUCHT
IM IM
MARKIERT
DRUCKT
AUS
ÜBERGIBT
AN
Trigger
Einmal pro Woche
Immer wenn ein
Kunde kommt
Trigger
Informationsfluss
Abteilung
Kinomanagement
Abteilung
Kartenverkauf
33. KASSEN-
MITARBEITER
KINO-
BESUCHER
WOCHENPLAN
<< in Arbeit >>
GEWÜNSCHTE
ANZAHL PLÄTZE
SAALPLAN
SAALPLAN-
STAPEL
VERKAUFTE
PLÄTZE
KARTEN
VORSTELLUNG
GEFUNDENE
PLÄTZE
SAALPLAN SAALPLAN
WOCHENPLAN
<< finalisiert >>
VERLEIHER
KINO-
MANAGER
WERBE-
AGENTUR BUCHUNGSPLAN
DER WERBUNG
VORGABEN
FÜR FILME
GESAMTDEUTSCHE
BESUCHERZAHLEN
VERFÜGBARKEIT
VON FILMEN
1
6
2
10
5
3
8
4
7
9
11
12
13
14
SAALPLAN
15
BEGINNT
SEINE ARBEIT
AN DEM
ÜBERPRÜFT
VERHANDELT
MIT
FINALISIERT
DEN
ERZEUGT FÜR DIE
NÄCHSTE WOCHE
GELDSUMME KINOKARTEN
BEZAHLTE
KINOKARTEN
FRAGT NACH
FÜR EINE
ÖFFNET
SCHLIESST
AUS DEM
BIETET
AN BEZAHLT
AN
SUCHT
IM IM
MARKIERT
DRUCKT
AUS
ÜBERGIBT
AN
Trigger
TriggerEinmal pro Woche
Immer wenn ein
Kunde kommt
Abteilung
Kinomanagement
Abteilung
Kartenverkauf
WOCHENPLAN
<< ausgedruckt >>
Informationsfluss
39. 24.01.2019 //// Seite 46WPS - Workplace Solutions GmbH
MOB ARCHITECTING – ARCHITEKTURANALYSE IM TEAM
40. 24.01.2019 //// Seite 47WPS - Workplace Solutions GmbH
FACHLICHE ZERLEGUNG: WIE GEHEN WIR VOR?
Refactorings
Analyse +
Diskussion
Maßnahmen
festlegen
Abbildungs-
Vorschrift
Ist-
Architektur
Rekonstruktion
Source-
Code
Fachliche
Module
Bounded
Contexts
Architektur-
alternativen
• Priorisierung der Maßnahmen
• Einplanung in den Entwicklungszyklus
Verletzungen
• Mit den Domänenexperten identifiziert
• Mit Fachsprachen + Prozessanalyse abgeglichen
41. 24.01.2019 //// Seite 48WPS - Workplace Solutions GmbH
MODULITH FIRST
▪Ausschneiden eines MS aus einem Monolithen ist nur möglich, wenn
dieser fachliche modularisiert ist
User Interface
Domain
Application
Fachliches
Modul B
Fachliches
Modul A
So wenig Beziehungen wie möglich!
TechnischeSchichtung
Fachliches
Modul C
42. 24.01.2019 //// Seite 49WPS - Workplace Solutions GmbH
TAKTISCHES UND STRATEGISCHES MODELLIEREN
Strategisches Modellieren (im Großen)
▪ Teile die Domäne in getrennte Bounded Contexts auf
▪ Jeder BC hat seine eigene ubiquitous language und sein eigenes Domänenmodell
Taktisches Modellieren (im Kleinen)
▪ Innerhalb eines Bounded Context
▪ Ubiquitous Language als Grundlage
▪ Building Blocks: Entity, Value Object,
Aggregate, Service, Repository, Factory
43. 24.01.2019 //// Seite 50WPS - Workplace Solutions GmbH
BUILDING BLOCKS = MUSTER FÜR DIE MIKRO ARCHITEKTUR
User Interface
Domain
Application
SchichtungdurchMuster
Bounded Context
Repository
Factory
Model
View
ValueObject
Service
Entity/
Aggregate
Controller
44. 24.01.2019 //// Seite 51WPS - Workplace Solutions GmbH
463 Klassen
aus über 50 Packages
47. 24.01.2019 //// Seite 54WPS - Workplace Solutions GmbH
184 Klassen in einem Zyklus
und mehrere Kleine Zyklen
48. 24.01.2019 //// Seite 55WPS - Workplace Solutions GmbH
WAS WIR NICHT BAUEN WOLLEN
✘
ANEMIC DOMAIN MODEL
▪ „blutarme“ fachliche Objekte
▪ Schnittstelle ohne Aussagekraft
▪ aus Gettern/Settern
▪ Viele String Parameter
▪ Eigentliche Fachlichkeit außerhalb
Entities + Value Objects in Services
oder im UI
▪ Viele Util, Helper und Manager Klassen
50. 24.01.2019 //// Seite 57WPS - Workplace Solutions GmbH
EIN BANKKONTO
public class Account {
private int _balance;
public int getBalance() {
return _balance;
}
public void setBalance(int balance) {
_balance = balance;
}
}
✘
Schlecht: Der
Kontostand kann
auf beliebigen
Wert gesetzt
werden
51. 24.01.2019 //// Seite 58WPS - Workplace Solutions GmbH
EIN BANKKONTO – ERSTES REFACTORING
public class Account {
private int _balance;
public int getBalance() {
return _balance;
}
public void deposit(int amount) {
_balance += amount;
}
public void withdraw(int amount) {
_balance -= amount;
}
}
Besser:
Methoden mit
fachlichem
Verhalten und
Namen
52. 24.01.2019 //// Seite 59WPS - Workplace Solutions GmbH
JA, ABER…
public class Account {
// ...
public void withdraw(int amount) {
_balance -= amount;
}
}
Kann ich einen
Negativen
Betrag
abheben?
In EUR oder
GBP oder … ?
53. 24.01.2019 //// Seite 60WPS - Workplace Solutions GmbH
EIN EIGENER VALUEOBEJCT BETRAG
public class Amount {
private final int _amount;
private final Currency _currency;
public Amount(int amount, Currency currency) {
_amount = amount;
_currency = currency;
}
}
54. 24.01.2019 //// Seite 61WPS - Workplace Solutions GmbH
EIN EIGENER VALUEOBEJCT BETRAG
public class Amount {
private final int _amount;
private final Currency _currency;
public Amount(int amount, Currency currency) {
_amount = amount;
_currency = currency;
}
@Override
public boolean equals(Object other) {
return _amount == ((Amount) other)._amount
&& _currency.equals(((Amount) other)._currency);
}
}
55. 24.01.2019 //// Seite 62WPS - Workplace Solutions GmbH
EIN EIGENER VALUEOBEJCT BETRAG
public class Amount {
private final int _amount;
private final Currency _currency;
public Amount(int amount, Currency currency) {
_amount = amount;
_currency = currency;
}
@Override
public boolean equals(Object other) {
return _amount == ((Amount) other)._amount
&& _currency.equals(((Amount) other)._currency);
}
// hashCode()
}
56. 24.01.2019 //// Seite 63WPS - Workplace Solutions GmbH
EIN EIGENER VALUEOBJECT BETRAG
public class Amount {
private final int _amount;
private final Currency _currency;
public Amount(int amount, Currency currency) {
_amount = amount;
_currency = currency;
}
public Amount add(Amount otherAmount) {
return new Amount(_amount + otherAmount._amount, _currency);
}
}
Der neueTyp hat
richtiges
fachliches
Verhalten
57. 24.01.2019 //// Seite 64WPS - Workplace Solutions GmbH
EIN BANKKONTO – ZWEITES REFACTORING
public class Account {
private Amount _balance;
public Amount getBalance() {
return _balance;
}
public void deposit(Amount amount) {
_balance = _balance.add(amount);
}
public void withdraw(Amount amount) {
_balance = _balance.subtract(amount);
}
}
Jetzt können wir
den Betrags-Typ
verwenden
58. 24.01.2019 //// Seite 65WPS - Workplace Solutions GmbH
DOMÄNEN KLASSEN ZERLEGEN ODER KOPIEREN!
User Interface
Domain
Application
Bounded Context
Model
View
ValueObject
Service
Entity/
Aggregate
Controller
Bounded Context
Model
View
ValueObject
Service
Entity/
Aggregate
Controller
Bounded Context
Model
View
ValueObject
Service
Entity/
Aggregate
Controller
59. 24.01.2019 //// Seite 66WPS - Workplace Solutions GmbH
WO STEHEN WIR?
612.869 LOC
14.756.435 LOC
252.062 LOC
804.093 LOC
543.388 LOC
1.035.668 LOC
486.358 LOC
175.258 LOC
42.311 LOC
193.383 LOC
643.466 LOC
245.754 LOC
2.890.204 LOC
141.696 LOC
512.086 LOC
9.988.363 LOC
200.591 LOC
922.949 LOC
22.658 LOC
663.862 LOC
3.270.188 LOC
1.521.357 LOC
0
2
4
6
8
10
Der MODULARITY MATURITY INDEX (MMI)