Das Liskov Substitution Principle

Definition

Das Liskov Substitution Principle (Liskovsche Substitutionsprinzip, LSP) ist eines der SOLID-Prinzipien. Es wurde erstmals 1987 von Barbara Liskov auf der Konferenz Data abstraction and hierarchy vorgestellt und wurde 1993 von Barbara Liskov und Jeannette Wing formuliert. „Es besagt, dass ein Programm, das Objekte einer Basisklasse T verwendet, auch mit Objekten der davon abgeleiteten Klasse S korrekt funktionieren muss, ohne dabei das Programm zu verändern.“

Beschreibung

Die primären Mechanismen hinter dem Offen-Geschlossen-Prinzip sind Abstraktion und Polymorphismus. In statisch typisierten Sprachen ist die Vererbung einer der wichtigsten Mechanismen welcher Abstraktion und Polymorphismus unterstützt. Durch die Verwendung der Vererbung kann man abgeleitete Klassen erstellen, welche den abstrakten polymorphen Schnittstellen entsprechen, die durch abstrakte Funktionen in abstrakten Basisklassen definiert werden. Die Bedeutung dieses Prinzips wird deutlich, wenn es verletzt wird.

Beispiel

Nehmen wir an, wir haben eine Klasse Rectangle (Rechteck) und eine davon abgeleitete Klasse Square (Quadrat).

public class Rectangle
{
     public double Width { get; set; }
     public double Height { get; set; }
}

public class Square : Rectangle
{
}

Wichtig dabei ist zu beachten, dass eine Vererbung immer eine „Ist-ein“ Beziehung beschreibt. Geometrisch betrachtet ist ein Quadrat ein Rechteck, nämlich eins mit gleich langen Seiten. Die „Ist-ein“ Beziehung kann jedoch irreführend sein. Würde die Klasse Rectangle die Methoden ScaleX() und ScaleY() implementieren, die es ihr erlauben die Breite und Höhe des Rechtecks unabhängig von einander zu ändern, würde auch die Klasse Square diese erben. Die Anwendung dieser Methoden auf einem Quadrat ist jedoch nicht erlaubt, da es nach der Änderung kein Quadrat mehr wäre.

Das Liskovsche Substitutionsprinzip deckt hier das Problem auf. In dem Beispiel würde die Aussage, dass „die Seiten unabhängig von einander skaliert werden können“, zwar für die Klasse Rectangle jedoch nicht für die Klasse Square gelten. Somit kann Square keine Unterklasse von Rectangle sein.

Das führt zu einer wichtigen Schlussfolgerung. Isoliert betrachtet kann ein Entwurf nicht sinnvoll überprüft werden. Die Gültigkeit eines Entwurfs kann nur in Bezug auf seine Clients ausgedrückt werden. Untersucht man die endgültige Version der Rectangle und Square Klasse so sind diese, isoliert betrachtet, in sich konsistent und gültig. Sieht man es jedoch aus der Sicht eines Programmierers, der vernünftige Annahmen über die Basisklasse macht, bricht der Entwurf zusammen.

Bei der Betrachtung, ob ein bestimmter Entwurf geeignet ist oder nicht, darf man die Lösung nicht nur isoliert betrachten. Man muss es in Bezug auf die vernünftigen Annahmen betrachten, die von den Benutzern des Entwurfs gemacht werden.

Das Liskovsche Substitutionsprinzip macht deutlich, dass im objektorientierten Entwurf die „Ist-ein“ Beziehung sich auf das Verhalten bezieht. Hierbei ist nicht das private sondern das öffentliche Verhalten gemeint, das Verhalten von dem die Clients abhängig sind. Somit müssen alle abgeleiteten Klassen dem Verhalten entsprechen, den die Clients von den Basisklassen die sie verwenden, erwarten.

Fazit

Das Offen-Geschlossen-Prinzip ist das Herzstück vieler Ansprüche die an den objektorientierten Entwurf gestellt werden. Wenn dieses Prinzip angewendet wird, sind die Anwendungen wartungsfreundlicher, wiederverwendbar und robust. Das Liskovsche Substitutionsprinzip ist ein wichtiges Merkmal aller Anwendungen die dem Offen-Geschlossen-Prinzip entsprechen. Nur wenn abgeleitete Typen vollständig austauschbar für ihre Basistypen sind, können Funktionen, die die Basistypen verwenden, sorglos wiederverwendet und abgeleitete Typen geändert werden.

Quellen

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.