SOLID PRINCIPLES
Designgrundlagen objektorientierter Systeme
–Fred Brooks, The Mythical Man Month (Jänner 1975)
„All successful software gets changed.“
JPA
lokale Beans
ohne Interface
alles Remote
CDI
konkrete CMPs
abstrakte CMPs
Java Server Pages
Java Server Faces
MVC 1.0
JPA
lokale Beans
ohne Interface
alles Remote
CDI
konkrete CMPs
abstrakte CMPs
Java Server Pages
Java Server Faces
MVC 1.0T...
The Single Responsibility Principle
A class should have only one reason to change.
Ein Anwendungsfall
public void erstelleProjekt(String projektName, String projektManager) {
if (projektName == null || ""....
Ein Anwendungsfall
public void erstelleProjekt(String projektName, String projektManager) {
if (projektName == null || ""....
Ein Anwendungsfall
@Inject
private SolidValidator validator;
public void erstelleProjekt(String projektName, String projek...
Ein Anwendungsfall
@Inject
private SolidValidator validator;
public void erstelleProjekt(String projektName, String projek...
Ein Anwendungsfall
@Inject
private SolidValidator validator;
@Inject
private BenutzerRepository users;
public void erstell...
Ein Anwendungsfall
@Inject
private SolidValidator validator;
@Inject
private BenutzerRepository users;
public void erstell...
Ein Anwendungsfall
@Inject
private SolidValidator validator;
@Inject
private BenutzerRepository users;
@Inject
private Pro...
Hinweise
Viele Methoden verwenden
das selbe
Feld?
Hinweise
Viele Methoden verwenden
das selbe
Feld?
private
Hinweise
Viele Methoden verwenden
das selbe
Feld?
Technologie &
Fachlichkeit
in derselben Klasse?
The Open/Closed Principle
Software entities should be open for extension but closed for modification.
Ein Anwendungsfall
Client Server
Ein Anwendungsfall
Client Server
Welche Methoden darf ich verwenden?
Ein Anwendungsfall
Client Server
Welche Methoden darf ich verwenden?
Welche Methoden werden eigentlich benötigt?
Ein Anwendungsfall
ClientInterfaceClient
Server
Ein Anwendungsfall
ClientInterfaceClient
Server
gehören
zusammen
Ein Anwendungsfall
ClientInterfaceClient
Server
gehören
zusammen
bestimmt die Funktion
Ein Anwendungsfall
ClientInterfaceClient
Server
gehören
zusammen
bestimmt die Funktion
closed for
modification
Ein Anwendungsfall
ClientInterfaceClient
Server
gehören
zusammen
bestimmt die Funktion
closed for
modification
open for
ex...
Ein Code Beispiel
public enum Typ {
ARBEITSPAKET, MEILENSTEIN
}
…
public Arbeitspaket findeErstenMeilenstein(List<Arbeitsp...
Ein Code Beispiel
public enum Typ {
ARBEITSPAKET, MEILENSTEIN
}
…
public Arbeitspaket findeErstenMeilenstein(List<Arbeitsp...
Ein Code Beispiel
public enum Typ {
ARBEITSPAKET, MEILENSTEIN
}
…
public Arbeitspaket findeErstenMeilenstein(List<Arbeitsp...
Ein Code Beispiel
public enum Typ {
ARBEITSPAKET, MEILENSTEIN
}
…
public Arbeitspaket findeErstenMeilenstein(List<Arbeitsp...
Ein Code Beispiel
public Arbeitspaket findeErstenMeilenstein(List<Arbeitspaket> arbeitspakete) {
for (Arbeitspaket arbeits...
Ein Code Beispiel
public Arbeitspaket findeErstenMeilenstein(List<Arbeitspaket> arbeitspakete) {
for (Arbeitspaket arbeits...
Ein Code Beispiel
public Arbeitspaket findeErstenMeilenstein(List<Arbeitspaket> arbeitspakete) {
for (Arbeitspaket arbeits...
Ein Code Beispiel
public Arbeitspaket findeErstenMeilenstein(List<Arbeitspaket> arbeitspakete) {
for (Arbeitspaket arbeits...
Hinweise
Das Hinzufügen oder Entfernen
einer Funktion muss
in vielen Klassen
nachgezogen werden.
Hinweise
Schnittstellen
entsprechen den Anforderungen
des Dienstanbieters
und nicht des Benutzers!
Das Hinzufügen oder Ent...
The Liskov Substitution Principle
Subtypes must be substitutable for their base types
Ein Anwendungsfall
Arbeitspaket
+getEndDate() : Date
+setDuration(int)
Ein Anwendungsfall
Arbeitspaket
+getEndDate() : Date
+setDuration(int)
Neue Anforderung: Wir benötigen
eine Klasse „Meilen...
Der erste Versuch
Arbeitspaket
+getEndDate() : Date
+setDuration(int)
Meilenstein
Der erste Versuch
Arbeitspaket
+getEndDate() : Date
+setDuration(int)
Meilenstein
Darf Beginn- und Enddatum
eines Meilenst...
Darf Beginn- und Enddatum
eines Meilensteins
voneinander abweichen?
Der zweite Versuch
Arbeitspaket
+getEndDate() : Date
+...
Darf Beginn- und Enddatum
eines Meilensteins
voneinander abweichen?
Der zweite Versuch
Arbeitspaket
+getEndDate() : Date
+...
Darf Beginn- und Enddatum
eines Meilensteins
voneinander abweichen?
Der zweite Versuch
Arbeitspaket
+getEndDate() : Date
+...
Darf Beginn- und Enddatum
eines Meilensteins
voneinander abweichen?
Der zweite Versuch
Arbeitspaket
+getEndDate() : Date
+...
Der dritte Versuch
Arbeitspaket
+setDuration(int)
Meilenstein
Phase
+getEndDate() : Date
Der dritte Versuch
Arbeitspaket
+setDuration(int)
Meilenstein
Phase
+getEndDate() : Date
identisches Verhalten
Der dritte Versuch
Arbeitspaket
+setDuration(int)
Meilenstein
Phase
+getEndDate() : Date
identisches Verhalten
unterschied...
Der dritte Versuch
Arbeitspaket
+setDuration(int)
Meilenstein
Phase
+getEndDate() : Date
identisches Verhalten
unterschied...
Hinweise
Das Verhalten der Elternklasse(n)
führt zu Fehlern.
Hinweise
Das Verhalten der Elternklasse(n)
führt zu Fehlern.
IsA-Beziehung (extends)
zwingt mich Methoden zu
überschreiben.
The Interface Segregation Principle
Clients should not be forced to depend on methods they do not use.
Ein Anwendungsfall
Security
User
Projekt+getRoles() : Role[]
+getProjekte() : Projekt[]
Ein Anwendungsfall
Security
User
Projekt+getRoles() : Role[]
+getProjekte() : Projekt[]
unnötige Kopplung!
Ein Anwendungsfall
Security
User
Projekt+getRoles() : Role[]
+getProjekte() : Projekt[]
unnötige Kopplung!
unnötige Kopplu...
Ein Anwendungsfall
UserImpl
+getProjekte() : Projekt[]
ProjektManager
Security
User
Projekt+getRoles() : Role[]
Ein Anwendungsfall
UserImpl
+getProjekte() : Projekt[]
ProjektManager
Security
User
Projekt+getRoles() : Role[]
FAIL!
Variante 1: Interfaces
Security
User
Projekt+getRoles() : Role[]
ProjektUser
+getProjekte() : Projekt[]
ProjektManager
Variante 2: Delegierung
Security
User
Projekt
+getRoles() : Role[]
+getProjekte() : Projekt[]
ProjektManager
Variante 3: Vererbung
Security
User
Projekt
+getRoles() : Role[]
+getProjekte() : Projekt[]
ProjektManager
Hinweise
Ich muss Methoden implementieren
die in der konkreten Klasse gar
keine Funktion erfüllen.
Hinweise
Ich muss Methoden implementieren
die in der konkreten Klasse gar
keine Funktion erfüllen.
Ich muss Module importi...
The Dependency-Inversion Principle
High Level Modules should not depend on low-level modules. Both should
depend on abstra...
Schichten
UseCase Layer
Service Layer
Utility Layer
Schichten
UseCase Layer
Service Layer
Utility Layer
High Level
„Erstelle Meilenstein“
Schichten
UseCase Layer
Service Layer
Utility Layer
High Level
„Erstelle Meilenstein“
Low Level
„SQL INSERT“
Invertierte Schichten
Service Layer
Utility Layer
UseCase
Service
Interface
Service
Interface
UseCase Layer
Invertierte Schichten
Service Layer
Utility Layer
UseCase
Service
Interface
Service
Interface
UseCase Layer
Abstractions
Invertierte Schichten
Service Layer
Utility Layer
UseCase
Service
Interface
Service
Interface
UseCase Layer
Abstractions
D...
Invertierte Schichten
Service Layer
Utility Layer
UseCase
Service
Interface
Service
Interface
UseCase Layer High
Low
Clean Architecture
High
Low
Clean Architecture
High
Lowui, db, web
Clean Architecture
High
Lowui, db, web
online, backoffice, batch
Clean Architecture
High
Lowui, db, web
online, backoffice, batch
domain services, entities
Clean Architecture
fachlich High
Lowui, db, web
online, backoffice, batch
domain services, entities
Clean Architecture
fachlich
technisch
High
Lowui, db, web
online, backoffice, batch
domain services, entities
Clean Architecture
Abhängigkeiten
fachlich
technisch
High
Lowui, db, web
online, backoffice, batch
domain services, entiti...
Hinweise
Ich kann
nicht Testen wenn
System X nicht zur Verfügung steht.
Hinweise
Ich kann
nicht Testen wenn
System X nicht zur Verfügung steht.
Ich kann
die Fachlichkeit
nicht erkennen und erhal...
Vielen Dank
mario.rodler@gmx.net
Nächste SlideShare
Wird geladen in …5
×

SOLID Prinzipien, Designgrundlagen objektorientierter Systeme

434 Aufrufe

Veröffentlicht am

Software die verwendet wird, muss irgendwann geändert werden. Das ist keine neue Erkenntnis.

Dennoch finden wir uns sehr oft in der Situation wieder, dass sich einfache Anforderungen nur mit erheblichem Aufwand umsetzen lassen oder zu unerwarteten Ergebnissen führen.

SOLID Prinzipien können uns helfen das Design unserer Anwendungen zu verbessern.

Veröffentlicht in: Technologie
0 Kommentare
0 Gefällt mir
Statistik
Notizen
  • Als Erste(r) kommentieren

  • Gehören Sie zu den Ersten, denen das gefällt!

Keine Downloads
Aufrufe
Aufrufe insgesamt
434
Auf SlideShare
0
Aus Einbettungen
0
Anzahl an Einbettungen
6
Aktionen
Geteilt
0
Downloads
1
Kommentare
0
Gefällt mir
0
Einbettungen 0
Keine Einbettungen

Keine Notizen für die Folie

SOLID Prinzipien, Designgrundlagen objektorientierter Systeme

  1. 1. SOLID PRINCIPLES Designgrundlagen objektorientierter Systeme
  2. 2. –Fred Brooks, The Mythical Man Month (Jänner 1975) „All successful software gets changed.“
  3. 3. JPA lokale Beans ohne Interface alles Remote CDI konkrete CMPs abstrakte CMPs Java Server Pages Java Server Faces MVC 1.0
  4. 4. JPA lokale Beans ohne Interface alles Remote CDI konkrete CMPs abstrakte CMPs Java Server Pages Java Server Faces MVC 1.0Technologie darf dem Design nicht im Weg stehen!
  5. 5. The Single Responsibility Principle A class should have only one reason to change.
  6. 6. Ein Anwendungsfall public void erstelleProjekt(String projektName, String projektManager) { if (projektName == null || "".equals(projektName)) { throw new IllegalArgumentException("argument projektName darf nicht null oder leer sein"); } if (projektManager == null || "".equals(projektManager)) { throw new IllegalArgumentException("argument projektManager darf nicht null oder leer sein"); } TypedQuery<User> query = entityManager.createQuery("select u from User u where u.name=:name", User.class); query.setParameter("name", projektManager); try { User user = query.getSingleResult(); Projekt projekt = new Projekt(projektName); projekt.setProjektManager(user); entityManager.persist(projekt); } catch (EntityNotFoundException e) { throw new ProAdmException("projekt konnte nicht erstellt werden."); } }
  7. 7. Ein Anwendungsfall public void erstelleProjekt(String projektName, String projektManager) { if (projektName == null || "".equals(projektName)) { throw new IllegalArgumentException("argument projektName darf nicht null oder leer sein"); } if (projektManager == null || "".equals(projektManager)) { throw new IllegalArgumentException("argument projektManager darf nicht null oder leer sein"); } TypedQuery<User> query = entityManager.createQuery("select u from User u where u.name=:name", User.class); query.setParameter("name", projektManager); try { User user = query.getSingleResult(); Projekt projekt = new Projekt(projektName); projekt.setProjektManager(user); entityManager.persist(projekt); } catch (EntityNotFoundException e) { throw new ProAdmException("projekt konnte nicht erstellt werden."); } } Format & Fehlermeldung
  8. 8. Ein Anwendungsfall @Inject private SolidValidator validator; public void erstelleProjekt(String projektName, String projektManager) { validator.validateProjektName(projektName); validator.validateProjektManagerName(projektManager); TypedQuery<User> query = entityManager.createQuery("select u from User u where u.name=:name", User.class); query.setParameter("name", projektManager); try { User user = query.getSingleResult(); Projekt projekt = new Projekt(projektName); projekt.setProjektManager(user); entityManager.persist(projekt); } catch (EntityNotFoundException e) { throw new ProAdmException("projekt konnte nicht erstellt werden."); } }
  9. 9. Ein Anwendungsfall @Inject private SolidValidator validator; public void erstelleProjekt(String projektName, String projektManager) { validator.validateProjektName(projektName); validator.validateProjektManagerName(projektManager); TypedQuery<User> query = entityManager.createQuery("select u from User u where u.name=:name", User.class); query.setParameter("name", projektManager); try { User user = query.getSingleResult(); Projekt projekt = new Projekt(projektName); projekt.setProjektManager(user); entityManager.persist(projekt); } catch (EntityNotFoundException e) { throw new ProAdmException("projekt konnte nicht erstellt werden."); } } JPA, JPA-QL & ExceptionHandling
  10. 10. Ein Anwendungsfall @Inject private SolidValidator validator; @Inject private BenutzerRepository users; public void erstelleProjekt(String projektName, String projektManager) { validator.validateProjektName(projektName); validator.validateProjektManagerName(projektManager); Benutzer user = users.getProjektManager(projektManager); Projekt projekt = new Projekt(projektName); projekt.setProjektManager(user); entityManager.persist(projekt); }
  11. 11. Ein Anwendungsfall @Inject private SolidValidator validator; @Inject private BenutzerRepository users; public void erstelleProjekt(String projektName, String projektManager) { validator.validateProjektName(projektName); validator.validateProjektManagerName(projektManager); Benutzer user = users.getProjektManager(projektManager); Projekt projekt = new Projekt(projektName); projekt.setProjektManager(user); entityManager.persist(projekt); } falsches Abstraktionslevel
  12. 12. Ein Anwendungsfall @Inject private SolidValidator validator; @Inject private BenutzerRepository users; @Inject private ProjektRepository projects; public void erstelleProjekt(String projektName, String projektManager) { validator.validateProjektName(projektName); validator.validateProjektManagerName(projektManager); Benutzer user = users.getProjektManager(projektManager); Projekt projekt = new Projekt(projektName); projekt.setProjektManager(user); projects.saveProjekt(projekt); }
  13. 13. Hinweise Viele Methoden verwenden das selbe Feld?
  14. 14. Hinweise Viele Methoden verwenden das selbe Feld? private
  15. 15. Hinweise Viele Methoden verwenden das selbe Feld? Technologie & Fachlichkeit in derselben Klasse?
  16. 16. The Open/Closed Principle Software entities should be open for extension but closed for modification.
  17. 17. Ein Anwendungsfall Client Server
  18. 18. Ein Anwendungsfall Client Server Welche Methoden darf ich verwenden?
  19. 19. Ein Anwendungsfall Client Server Welche Methoden darf ich verwenden? Welche Methoden werden eigentlich benötigt?
  20. 20. Ein Anwendungsfall ClientInterfaceClient Server
  21. 21. Ein Anwendungsfall ClientInterfaceClient Server gehören zusammen
  22. 22. Ein Anwendungsfall ClientInterfaceClient Server gehören zusammen bestimmt die Funktion
  23. 23. Ein Anwendungsfall ClientInterfaceClient Server gehören zusammen bestimmt die Funktion closed for modification
  24. 24. Ein Anwendungsfall ClientInterfaceClient Server gehören zusammen bestimmt die Funktion closed for modification open for extension
  25. 25. Ein Code Beispiel public enum Typ { ARBEITSPAKET, MEILENSTEIN } … public Arbeitspaket findeErstenMeilenstein(List<Arbeitspaket> arbeitspakete){ for (Arbeitspaket arbeitspaket : arbeitspakete) { if(Typ.MEILENSTEIN == arbeitspaket.getTyp()){ return arbeitspaket; } } return null; }
  26. 26. Ein Code Beispiel public enum Typ { ARBEITSPAKET, MEILENSTEIN } … public Arbeitspaket findeErstenMeilenstein(List<Arbeitspaket> arbeitspakete){ for (Arbeitspaket arbeitspaket : arbeitspakete) { if(Typ.MEILENSTEIN == arbeitspaket.getTyp()){ return arbeitspaket; } } return null; } Neue Anforderung: ProjektStart undProjektEnde, beides Meilensteine
  27. 27. Ein Code Beispiel public enum Typ { ARBEITSPAKET, MEILENSTEIN } … public Arbeitspaket findeErstenMeilenstein(List<Arbeitspaket> arbeitspakete){ for (Arbeitspaket arbeitspaket : arbeitspakete) { if(Typ.MEILENSTEIN == arbeitspaket.getTyp()){ return arbeitspaket; } } return null; } Neue Anforderung: ProjektStart undProjektEnde, beides Meilensteine gute Idee
  28. 28. Ein Code Beispiel public enum Typ { ARBEITSPAKET, MEILENSTEIN } … public Arbeitspaket findeErstenMeilenstein(List<Arbeitspaket> arbeitspakete){ for (Arbeitspaket arbeitspaket : arbeitspakete) { if(Typ.MEILENSTEIN == arbeitspaket.getTyp()){ return arbeitspaket; } } return null; } Neue Anforderung: ProjektStart undProjektEnde, beides Meilensteine gute Idee hier ein Problem
  29. 29. Ein Code Beispiel public Arbeitspaket findeErstenMeilenstein(List<Arbeitspaket> arbeitspakete) { for (Arbeitspaket arbeitspaket : arbeitspakete) { if (arbeitspaket.getTyp().isMeilenstein()) { return arbeitspaket; } } return null; }
  30. 30. Ein Code Beispiel public Arbeitspaket findeErstenMeilenstein(List<Arbeitspaket> arbeitspakete) { for (Arbeitspaket arbeitspaket : arbeitspakete) { if (arbeitspaket.getTyp().isMeilenstein()) { return arbeitspaket; } } return null; } public interface ArbeitspaketTyp { boolean isMeilenstein(); boolean isArbeitspaket(); }
  31. 31. Ein Code Beispiel public Arbeitspaket findeErstenMeilenstein(List<Arbeitspaket> arbeitspakete) { for (Arbeitspaket arbeitspaket : arbeitspakete) { if (arbeitspaket.getTyp().isMeilenstein()) { return arbeitspaket; } } return null; } public interface ArbeitspaketTyp { boolean isMeilenstein(); boolean isArbeitspaket(); } public enum Typ implements ArbeitspaketTyp{ ARBEITSPAKET { @Override public boolean isArbeitspaket() { return true; } }, PROJEKTSTART { @Override public boolean isMeilenstein() { return true; } }, PROJEKTENDE { @Override public boolean isMeilenstein() { return true; } }, MEILENSTEIN { @Override public boolean isMeilenstein() { return true; } }; public boolean isMeilenstein() { return false; } public boolean isArbeitspaket() { return false; } }
  32. 32. Ein Code Beispiel public Arbeitspaket findeErstenMeilenstein(List<Arbeitspaket> arbeitspakete) { for (Arbeitspaket arbeitspaket : arbeitspakete) { if (arbeitspaket.getTyp().isMeilenstein()) { return arbeitspaket; } } return null; } public interface ArbeitspaketTyp { boolean isMeilenstein(); boolean isArbeitspaket(); } public enum Typ implements ArbeitspaketTyp{ ARBEITSPAKET { @Override public boolean isArbeitspaket() { return true; } }, PROJEKTSTART { @Override public boolean isMeilenstein() { return true; } }, PROJEKTENDE { @Override public boolean isMeilenstein() { return true; } }, MEILENSTEIN { @Override public boolean isMeilenstein() { return true; } }; public boolean isMeilenstein() { return false; } public boolean isArbeitspaket() { return false; } } Closed for Modification, Open for Extension
  33. 33. Hinweise Das Hinzufügen oder Entfernen einer Funktion muss in vielen Klassen nachgezogen werden.
  34. 34. Hinweise Schnittstellen entsprechen den Anforderungen des Dienstanbieters und nicht des Benutzers! Das Hinzufügen oder Entfernen einer Funktion muss in vielen Klassen nachgezogen werden.
  35. 35. The Liskov Substitution Principle Subtypes must be substitutable for their base types
  36. 36. Ein Anwendungsfall Arbeitspaket +getEndDate() : Date +setDuration(int)
  37. 37. Ein Anwendungsfall Arbeitspaket +getEndDate() : Date +setDuration(int) Neue Anforderung: Wir benötigen eine Klasse „Meilensteine“
  38. 38. Der erste Versuch Arbeitspaket +getEndDate() : Date +setDuration(int) Meilenstein
  39. 39. Der erste Versuch Arbeitspaket +getEndDate() : Date +setDuration(int) Meilenstein Darf Beginn- und Enddatum eines Meilensteins voneinander abweichen?
  40. 40. Darf Beginn- und Enddatum eines Meilensteins voneinander abweichen? Der zweite Versuch Arbeitspaket +getEndDate() : Date +setDuration(int) Meilenstein +setDuration(int)
  41. 41. Darf Beginn- und Enddatum eines Meilensteins voneinander abweichen? Der zweite Versuch Arbeitspaket +getEndDate() : Date +setDuration(int) Meilenstein +setDuration(int) public class Meilenstein extends Arbeitspaket{ public void setDuration(int days){ throw new ProAdmException("unsupported operation."); } }
  42. 42. Darf Beginn- und Enddatum eines Meilensteins voneinander abweichen? Der zweite Versuch Arbeitspaket +getEndDate() : Date +setDuration(int) Meilenstein +setDuration(int) public class Meilenstein extends Arbeitspaket{ public void setDuration(int days){ throw new ProAdmException("unsupported operation."); } } public class Meilenstein extends Arbeitspaket{ public void setDuration(int days){ // ignore } } FAIL!
  43. 43. Darf Beginn- und Enddatum eines Meilensteins voneinander abweichen? Der zweite Versuch Arbeitspaket +getEndDate() : Date +setDuration(int) Meilenstein +setDuration(int) public class Meilenstein extends Arbeitspaket{ public void setDuration(int days){ throw new ProAdmException("unsupported operation."); } } public class Meilenstein extends Arbeitspaket{ public void setDuration(int days){ // ignore } } FAIL! FAIL!
  44. 44. Der dritte Versuch Arbeitspaket +setDuration(int) Meilenstein Phase +getEndDate() : Date
  45. 45. Der dritte Versuch Arbeitspaket +setDuration(int) Meilenstein Phase +getEndDate() : Date identisches Verhalten
  46. 46. Der dritte Versuch Arbeitspaket +setDuration(int) Meilenstein Phase +getEndDate() : Date identisches Verhalten unterschiedliches Verhalten
  47. 47. Der dritte Versuch Arbeitspaket +setDuration(int) Meilenstein Phase +getEndDate() : Date identisches Verhalten unterschiedliches Verhalten Subtypes are substitutable for their base types
  48. 48. Hinweise Das Verhalten der Elternklasse(n) führt zu Fehlern.
  49. 49. Hinweise Das Verhalten der Elternklasse(n) führt zu Fehlern. IsA-Beziehung (extends) zwingt mich Methoden zu überschreiben.
  50. 50. The Interface Segregation Principle Clients should not be forced to depend on methods they do not use.
  51. 51. Ein Anwendungsfall Security User Projekt+getRoles() : Role[] +getProjekte() : Projekt[]
  52. 52. Ein Anwendungsfall Security User Projekt+getRoles() : Role[] +getProjekte() : Projekt[] unnötige Kopplung!
  53. 53. Ein Anwendungsfall Security User Projekt+getRoles() : Role[] +getProjekte() : Projekt[] unnötige Kopplung! unnötige Kopplung!
  54. 54. Ein Anwendungsfall UserImpl +getProjekte() : Projekt[] ProjektManager Security User Projekt+getRoles() : Role[]
  55. 55. Ein Anwendungsfall UserImpl +getProjekte() : Projekt[] ProjektManager Security User Projekt+getRoles() : Role[] FAIL!
  56. 56. Variante 1: Interfaces Security User Projekt+getRoles() : Role[] ProjektUser +getProjekte() : Projekt[] ProjektManager
  57. 57. Variante 2: Delegierung Security User Projekt +getRoles() : Role[] +getProjekte() : Projekt[] ProjektManager
  58. 58. Variante 3: Vererbung Security User Projekt +getRoles() : Role[] +getProjekte() : Projekt[] ProjektManager
  59. 59. Hinweise Ich muss Methoden implementieren die in der konkreten Klasse gar keine Funktion erfüllen.
  60. 60. Hinweise Ich muss Methoden implementieren die in der konkreten Klasse gar keine Funktion erfüllen. Ich muss Module importieren die in meiner Anwendung gar keine Funktion erfüllen.
  61. 61. The Dependency-Inversion Principle High Level Modules should not depend on low-level modules. Both should depend on abstractions. Abstractions should not depend on details. Details should depend upon abstractions.
  62. 62. Schichten UseCase Layer Service Layer Utility Layer
  63. 63. Schichten UseCase Layer Service Layer Utility Layer High Level „Erstelle Meilenstein“
  64. 64. Schichten UseCase Layer Service Layer Utility Layer High Level „Erstelle Meilenstein“ Low Level „SQL INSERT“
  65. 65. Invertierte Schichten Service Layer Utility Layer UseCase Service Interface Service Interface UseCase Layer
  66. 66. Invertierte Schichten Service Layer Utility Layer UseCase Service Interface Service Interface UseCase Layer Abstractions
  67. 67. Invertierte Schichten Service Layer Utility Layer UseCase Service Interface Service Interface UseCase Layer Abstractions Details
  68. 68. Invertierte Schichten Service Layer Utility Layer UseCase Service Interface Service Interface UseCase Layer High Low
  69. 69. Clean Architecture High Low
  70. 70. Clean Architecture High Lowui, db, web
  71. 71. Clean Architecture High Lowui, db, web online, backoffice, batch
  72. 72. Clean Architecture High Lowui, db, web online, backoffice, batch domain services, entities
  73. 73. Clean Architecture fachlich High Lowui, db, web online, backoffice, batch domain services, entities
  74. 74. Clean Architecture fachlich technisch High Lowui, db, web online, backoffice, batch domain services, entities
  75. 75. Clean Architecture Abhängigkeiten fachlich technisch High Lowui, db, web online, backoffice, batch domain services, entities
  76. 76. Hinweise Ich kann nicht Testen wenn System X nicht zur Verfügung steht.
  77. 77. Hinweise Ich kann nicht Testen wenn System X nicht zur Verfügung steht. Ich kann die Fachlichkeit nicht erkennen und erhalten.
  78. 78. Vielen Dank mario.rodler@gmx.net

×