- Single Responsibility Principle: Eine Klasse sollte nur eine Aufgabe haben.
- Open/Closed Principle: Eine Klasse sollte offen für Erweiterungen, aber geschlossen für Änderungen sein.
- Liskov Substitution Principle: Objekte einer Klasse sollten durch Objekte einer Subklasse ersetzbar sein.
- Interface Segregation Principle: Interfaces sollten spezifisch für die Klassen sein, die sie implementieren.
- Dependency Inversion Principle: Klassen sollten von abstrakten Klassen oder Interfaces abhängen, nicht von konkreten Klassen.
Regression Testing ist wichtig, um sicherzustellen, dass Änderungen keine unerwünschten Nebenwirkungen haben.
- Eine Klasse sollte nur eine Aufgabe haben.
// Bad
class GameReulst {
public void saveGameResult() {
// Code to save game result
}
public void sendEmail() {
// Code to send email
}
}
- Eine Klasse sollte offen für Erweiterungen, aber geschlossen für Änderungen sein.
- Code Duplication: Wenn die gleiche Funktionalität in mehreren Klassen vorhanden ist.
- Code Smell: Wenn der Code schlecht strukturiert ist.
- Code Complexity: Wenn der Code schwer zu verstehen ist.
- Objekte einer Klasse sollten durch Objekte einer Subklasse ersetzbar sein. z.B.
Square ist eine Shape.
- Interfaces sollten spezifisch für die Klassen sein, die sie implementieren.
// Bad
interface Worker {
void work();
void eat();
}
// Good
interface Worker {
void work();
}
interface Eater {
void eat();
}
- Klassen sollten von abstrakten Klassen oder Interfaces abhängen, nicht von konkreten Klassen.
// Bad
class Game {
private GameResult gameResult;
public Game() {
gameResult = new GameResult();
}
}
// Good
class Game {
private GameResult gameResult;
public Game(GameResult gameResult) {
this.gameResult = gameResult;
}
}
- Singleton Pattern: Eine Klasse sollte nur eine Instanz haben.
- Factory Pattern: Eine Klasse sollte die Instanz einer anderen Klasse erstellen.
- Proxy Pattern: Eine Klasse sollte die Kontrolle über eine andere Klasse haben.
- Observer Pattern: Eine Klasse sollte über Änderungen in einer anderen Klasse informiert werden.
- Strategy Pattern: Eine Klasse sollte eine von mehreren Algorithmen verwenden können. z.B: eine Klasse
Sort kann BubbleSort, QuickSort, MergeSort verwenden. - Decorator Pattern: Eine Klasse sollte die Funktionalität einer anderen Klasse erweitern können. z.B: eine Klasse
Car kann CarWithAC, CarWithMusicSystem sein.