Um die Reihe der S.O.L.I.D.-Prinzipien
weiter zu vervollständigen, nehme ich das Liskovsche
Substitutionsprinzip in den Katalog auf. Wie sich zeigen wird,
erscheint die Einordnung als Prinzip jedoch zumindest als fragwürdig.
Name, Kurzform | Liskovsches Substitutionsprinzip |
Synonyme |
Substitutionsprinzip,
Ersetzbarkeitsprinzip,
LSP |
Beschreibung |
Klassen
sollen in jedem Fall durch ihre Unterklassen ersetzbar sein.
|
Erläuterung |
In
der ursprünglichen Formulierung von Liskov und Wing [Liskov 1994]
klingt dies noch weniger eingängig, und auch von „Prinzip“
ist hier noch nicht die Rede. Die Autorinnen bezeichnen Folgendes
als „Subtype Requirement“:
„Sei
p(x) eine beweisbare Eigenschaft von Objekten x des Typs T. Dann
soll p(x) auch für Objekte y des Typs S wahr sein, wenn S ein
Subtyp von T ist.“
Das
LSP drückt keine rein syntaktische Einschränkung aus: Was eine
„beweisbare Eigenschaft“ ist, lässt sich nicht ausschließlich
über den Programmcode ermitteln. Liskov und Wing schreiben dies
allgemeiner der „Typspezifikation“ zu:
„Die
Typspezifikation legt fest, welche Eigenschaften eines Objekts
beweisbar sind.“
Dass
es sich hierbei durchaus um rein semantische Annahmen über das
Verhalten eines Typs handeln kann, zeigt das gewählte Beispiel:
Die Typen Stack und Queue weisen beide die Methoden put() und
get() auf, könnten also formal in einer Supertyp/Subtyp-Beziehung
stehen. Und dennoch wird ein Programm, dass davon ausgeht, mit
einem Stack zu arbeiten, wahrscheinlich nicht funktionieren, wenn
es sich dabei um eine Queue handelt.
Das
LSP steht in dieser Hinsicht dem „Design by Contract“-Ansatz
von Bertrand Meyer nahe, in welchem sich das Verhalten eines
Stacks mittels Vor- und Nachbedingungen präziser ausdrücken
ließe.
Zur
Bedeutung des Prinzips lassen sich einige Anmerkungen machen:
|
Beispiele | Häufig werden mathematische Beispiele wie Ellipse – Kreis oder Rechteck – Quadrat zur Demonstration verwendet. Während sich beispielsweise Länge und Breite eines Rechtecks mit unterschiedlichen Werten belegen lassen, ist dies für Quadrate nicht der Fall. Obwohl das Quadrat in mathematischer Hinsicht eine Spezialisierung des Rechtecks ist, kann es daher gegen das LSP verstoßen, das Quadrat als Subtyp von Rechteck zu modellieren. |
Historie |
|
Art des Prinzips |
|
Grad der formalen Spezifikation | Nur hoch in Kombination mit „Design by Contract“-ähnlichen Ansätzen, welche die Typsemantik so formal wie möglich ausdrücken. |
Vorteile |
Vermeidung
schwerwiegender semantischer Probleme bei der Verwendung von
Subtypen.
|
Nachteile | - |
Übergeordnete Prinzipien | Verwandschaft mit dem allgemeineren „Prinzip der minimalen Verwunderung“. |
Abgleitete Prinzipien | - |
Qualitätsmerkmale | Korrektheit(+) |
Quellen:
[Starke 2011] – Effektive
Software-Architekturen, Gernot Starke (2011)