SOLID
Das Akronym SOLID bezeichnet fünf Prinzipien, deren Anwendung die Wartbarkeit von Software signifikant erhöht. Die fünf Prinzipien sind:
- das Single Responsibility-Prinzip
- das Open/Closed-Prinzip
- das Liskov'sche Substitutionsprinzip
- das Interface Segregation-Prinzip
- das Dependency Inversion-Prinzip
Diese Prinzipien werden seit der Jahrtausendwende von "Uncle Bob" Robert C. Martin propagiert. Michael Feathers erfand dazu später das Akronym SOLID.
Das Single Responsibility-Prinzip besagt, dass jede Klasse (und Methode) genau eine Verantwortlichkeit haben soll. Dieses Prinzip darf man nicht zu strikt auslegen, sondern muss den Begriff der Verantwortlichkeit aus einer gewissen "Flughöhe" sehen. Ansonsten würde man bei Objekten landen, die immer nur eine Methode mit genau einer Zeile Code haben.
Eine andere, sehr nützliche Sichtweise auf das Single Responsibility-Prinzip ist, dass es genau einen Grund geben sollte, eine Klasse zu ändern. Gibt es mehrere Gründe dafür, dann hat die Klasse zu viele Verantwortlichkeiten.
Das Open/Closed-Prinzip besagt, dass eine Klasse offen für Erweiterungen, aber geschlossen für Modifikationen sein soll. Aus diesem Prinzip können wir viele Erkenntnisse bezüglich Sichtbarkeit von Properties und Methoden und dem Einsatz von Vererbung im Allgemeinen gewinnen: minimale Sichtbarkeit, alle Klassen final, nur von abstrakten Basisklassen erben und dort alle öffentlichen Methoden konsequent als final markieren.
Das Liskov'sche Substitutionsprinzip fordert, dass man Objekte jederzeit durch abgeleitete Klassen ersetzen können muss. Aus diesem Prinzip resultieren viele Einschränkungen bezüglich veränderter Methodensignaturen in Vererbungshierarchien, die in PHP glücklicherweise so in der Programmiersprache verankert sind, dass es schwierig wird, das Liskov'sche Substitutionsprinzip in PHP überhaupt zu verletzen. Wenn man über das Verhalten von Objekten nachdenkt und damit auch über die Rückgabewerte oder eventuell geworfene Exceptions, kann man auch in PHP durchaus Fehler machen, welche die Substituierbarkeit einschränken.
Das Interface Segregation-Prinzip sagt aus, dass man nicht von Schnittstellen abhängig sein sollte, die man nicht benutzt. Anstelle also eine große Schnittstelle mit vielen Methoden zu definieren, sollte man mehrere kleinere und jeweils kohärente Interfaces definieren und implementieren. Das Typsystem von PHP bietet seit der Version 8.1 mit Union Types und Intersection Types interessante Möglichkeiten, das Interface Segregation-Prinzip noch konsequenter umzusetzen.
Das Dependency Inversion-Prinzip , nicht zu verwechseln mit Dependency Injection, ist das vielleicht wichtigste der fünf SOLID-Prinzipien. Im Grunde motiviert das Dependency Inversion-Prinzip eine hexagonale Architektur, es lässt sich aber auch im Kleinen anwenden und als Begründung für das Einführen von Wertobjekten verwenden. Man macht beispielsweise sich besser von einer durch ein Wertobjekt eingeführte Abstraktion abhängig als von Implementierungsdetails wie skalaren Typen.