David Schirrmeister 73e1392286 update
2024-12-05 13:53:10 +01:00

91 lines
2.8 KiB
Markdown

# SOLID
## S - Single Responsibility Principle (SRP)
- Änderungen entstehen, wo Verantwortung ist
- Verantwortung ist ein Grund zur Änderung
- Falls eine Klasse mehr als eine Verantwortung hat
- Verantwortungen werden gruppiert :(
- Führt zu [fragilem Design](AgileDesign.md#fragility-zerbrechlichkeit)
### Beispiel SRP Verletzung
- ![image_364.png](image_364.png)
- Erzeugte Probleme
- GUI muss in computionalGeometryApplication inkludiert werden
- Änderungen in Graphical führen zu Änderungen in computional
- Besser:
- ![image_365.png](image_365.png)
### Was ist eine Responsibility
- Ein Grund zur Änderung
- Wenn jemandem mehr als eine Idee einfällt, warum man die Klasse ändern könnte
- Mehrere Responsibilitys
## O - Open/Closed Principle (OCP)
- Änderungen an einzelnen Dateien sollen sich nicht auf andere Klassen auswirken
- Lieber neuen Code statt Code zu ändern, der funktioniert
- Wird durch Abstraktion erreicht
- Abstraktion ist nach außen fest
- Geerbte Klassen können Methoden neu zu ihren Bedürfnissen anpassen
### Beispiel OCP Verletzung
- ![image_366.png](image_366.png)
- Client nutzt Server Klasse
- Falls Server sich clientseitig ändert gehts teilweise nicht mehr
- Besser:
- ![image_367.png](image_367.png)
### Wann OCP anwenden?
- Gegen welche Änderungen möchte man sich schützen?
- Nicht gegen die falschen Änderungen
- häufig falsch, aber passiert
- Häufig unnötig → [Needless Complexity](AgileDesign.md#needless-complexity)
## L - Liskov's Substitution Principle (LSP)
- Subtypen müssen passend zu ihren Basisklassen sein
- Macht OCP besser
### Beispiel LSP Verletzung
- ![image_368.png](image_368.png)
- Pinguin kann nicht fliegen → :(
- Besser:
- ![image_369.png](image_369.png)
## I - Interface Segregation Principle (ISP)
- Niemanden dazu zwingen Interfaces zu nutzen
- ![image_371.png](image_371.png)
### Beispiel ISP Verletzung
- ![image_372.png](image_372.png)
- Besser
- ![image_373.png](image_373.png)
### Conclusion ISP
- Fette Klassen erzeugen schädigende Kupplung zwischen ihren Klienten
## D - Dependency Inversion Principle (DIP)
- Abstraktionen sollten nicht von Details abhängig sein
- DIP behandelt Besitztum und Abhängigkeiten
- Detaillierte Implementierungen definieren die Abstraktion, von der sie abhängig sind
### Naive Layering System
- High Level Policy Layer
- Lower Level Mechanism Layer
- Detailed Level Utility Layer
### Inversion of Ownership
- ![image_370.png](image_370.png)
### When to use the DIP?
- Nichts sollte von einer konkreten Klasse abhängig sein
- Keine Variable sollte einen Pointer auf eine andere Klasse enthalten
- Keine Methode sollte eine bereits implementierte Methode seiner Basisklasse überschreiben
### Conclusion DIP
- Sowohl Policies als auch Detail basieren auf Abstraktion
- Fundamentaler low-level Mechanismus hinter OOAD