# Design Principles
## [SOLID Design Principles](SOLID-Principle.md)
- Fokus auf der Erstellung von Code
- Wartbar, Robust, Wiederverwendbar

### S - Single Responsibility Principle (SRP)
- Eine Klasse sollte nur eine einzige Aufgabe / Verantwortung haben 
### O - Open/Closed Principle (OCP)
- Software Komponenten sollten nur fpr Erweiterung, nicht für Modifikation offen sein
### L - Liskov's Substitution Principle (LSP)
- Basisklassen müssen komplett passend für die erbenden Klassen sein
### I - Interface Segregation Principle (ISP)
- Clients sollten nicht dazu verpflichtet werden unnötige Methoden zu implementieren
### D - Dependency Inversion Principle (DIP)
- Abhängig von Abstraktion, nicht Konkretion


## Favor Composition over Inheritance
- Vererbung ist ein offensichtlicher Weg um Code von der Basisklasse wiederzuverwenden
- Unterklassen können die Codebasis der Basisklassen nicht verkleinern
  - Methoden des Interfaces müssen alle implementiert werden

### Composition
- Inheritance: _is-a relationship_
- Composition
  - _contains relationship_
- Prinzip kann auch auf Aggregation angewendet werden
- ![image_374.png](image_374.png)

