www.wikidata.de-de.nina.az
Das Liskovsche Substitutionsprinzip LSP oder Ersetzbarkeitsprinzip ist ein Kriterium in der objektorientierten Programmierung das die Bedingungen zur Modellierung eines Datentyps fur seinen Untertyp angibt 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 verandern Das Liskovsche Substitutionsprinzip wurde erstmals 1987 von Barbara Liskov auf einer Konferenz Data abstraction and hierarchy vorgestellt und wurde 1993 von Barbara Liskov und Jeannette Wing formuliert 1 In einem nachfolgenden Artikel wurde es folgendermassen formuliert Ubersetzung Eine starkere Forderung als Kovarianz und Kontravarianz wird benotigt die das Verhalten von Untertypen einschrankt Eigenschaften die anhand der Spezifikation des vermeintlichen Typs eines Objektes bewiesen werden konnen sollten auch dann gelten wenn das Objekt einem Untertyp dieses Typs angehort Sei q x displaystyle q x eine beweisbare Eigenschaft von Objekten x displaystyle x des Typs T displaystyle T Dann soll q y displaystyle q y fur Objekte y displaystyle y des Typs S displaystyle S wahr sein wobei S displaystyle S ein Untertyp von T displaystyle T ist 2 dd Damit ist garantiert dass Operationen die auf ein Objekt des Typs T displaystyle T vom Typ S displaystyle S angewendet werden auch korrekt ausgefuhrt werden In einigen der heute ublichen Programmiersprachen die Polymorphie unterstutzen kann dieses Prinzip durch Vererbung von mehr als einem Objekt auf ein anderes verletzt werden Dann liesse sich nicht stets bedenkenlos ein Objekt vom Typ T displaystyle T durch ein Objekt vom Typ S displaystyle S ersetzen Bezogen auf einzelne Methoden bedeutet das Liskovsche Substitutionsprinzip dass beim Uberschreiben einer Methode durch eine abgeleitete Klasse die Vorbedingungen nur abgeschwacht und die Nachbedingungen nur verstarkt werden durfen siehe Design by Contract Das Problem Bearbeiten Hauptartikel Kreis Ellipse Problem nbsp UML Darstellung der Klasse GrafischesElement und deren UnterklassenEin wichtiges Element objektorientierter Programmierung ist die Vererbung Eine Klasse die Unterklasse wird von einer anderen Klasse ihrer Oberklasse abgeleitet und erbt dabei ihre Methoden und Datenelemente Dabei konnen neue Datenelemente hinzugefugt sowie Methoden hinzugefugt oder ersetzt werden Dies fuhrt zur Frage was Vererbung uber die Beziehung der Oberklasse zur Unterklasse aussagt Diese Frage wird normalerweise beantwortet mit Vererbung beschreibt eine ist ein Beziehung Eine typische Hierarchie von Klassen in einem Grafikprogramm konnte z B aus einer Oberklasse GrafischesElement und davon abgeleiteten Unterklassen wie Rechteck Ellipse oder Text bestehen Beispielsweise wird man die Ableitung der Klasse Ellipse von der Klasse GrafischesElement begrunden mit Eine Ellipse ist ein grafisches Element Die Klasse GrafischesElement kann dann beispielsweise eine allgemeine Methode zeichne definieren die von Ellipse ersetzt wird durch eine Methode die speziell eine Ellipse zeichnet Das Problem hierbei ist jedoch dass das ist ein Kriterium manchmal in die Irre fuhrt Wird fur das Grafikprogramm beispielsweise die Klasse Kreis definiert so wurde man bei naiver Anwendung des ist ein Kriteriums diese Klasse von Ellipse ableiten denn ein Kreis ist eine Ellipse namlich eine Ellipse mit gleich langen Halbachsen Diese Ableitung kann jedoch im Kontext des Grafikprogramms falsch sein Grafikprogramme erlauben es ublicherweise die grafischen Elemente zu verandern Beispielsweise lasst sich bei Ellipsen die Lange der beiden Halbachsen unabhangig voneinander andern Fur einen Kreis gilt dies jedoch nicht denn nach einer solchen Anderung ware er kein Kreis mehr Hat also die Klasse Ellipse die Methoden SkaliereX und SkaliereY so wurde die Klasse Kreis diese Methoden erben obwohl ihre Anwendung fur einen Kreis nicht erlaubt ist Das Liskovsche Substitutionsprinzip deckt hier das Problem auf Im vorliegenden Fall wurde festgestellt dass die Aussage die Achsen konnen unabhangig voneinander skaliert werden zwar fur die Klasse Ellipse jedoch nicht fur die Klasse Kreis gilt Ware jedoch Kreis eine Unterklasse von Ellipse so musste nach dem Liskovschen Substitutionsprinzip diese Aussage auch fur die Klasse Kreis gelten Daher ist Kreis hier keine Unterklasse von Ellipse Zu beachten ist hierbei dass die Entscheidung jeweils abhangig vom konkreten Fall ist Ist beispielsweise eine Manipulation der geometrischen Figur nach der Erzeugung nicht vorgesehen so kann Kreis durchaus von Ellipse abgeleitet sein Dass die Achsen unabhangig voneinander skaliert werden konnen ist dann keine Eigenschaft der Klasse Ellipse und somit muss sie auch keine Eigenschaft von Kreis sein um Kreis zur Unterklasse von Ellipse zu machen Das Kreis Ellipse Problem als C Code public class GrafischesElement public virtual void Zeichne Code zum Zeichnen des Elements public class Ellipse GrafischesElement public override void Zeichne Code zum Zeichnen der Ellipse public void SkaliereX double pX Code zum Skalieren der X Achse public void SkaliereY double pY Code zum Skalieren der Y Achse public class Kreis Ellipse SkaliereR sollte statt SkaliereX SkaliereY aufgerufen werden public void SkaliereR double pR SkaliereX pR 2 SkaliereY pR 2 public void ZeichenBrett public double X get set public double Y get set Noch mehr Eigenschaften private List lt GrafischesElement gt ListeGrafischeElemente get set Noch mehr Variablen public void Aktualisiere foreach GrafischesElement gElem in ListeGrafischeElemente if gElem is Ellipse var ellipse gElem as Ellipse ellipse SkaliereX this X lt Kreis erbt von Ellipse Kreis IST eine Ellipse ellipse SkaliereY this Y lt Kreis erbt von Ellipse Kreis IST eine Ellipse Noch mehr Code zum Neu Zeichnen andere grafische Elemente Einzelnachweise Bearbeiten Barbara H Liskov Jeannette M Wing Family Values A Behavioral Notion of Subtyping Pittsburgh 1993 PostScript Barbara H Liskov Jeannette M Wing Behavioral Subtyping Using Invariants and Constraints Pittsburgh 1999 PostScript VPrinzipien objektorientierten DesignsSOLID Prinzipien Single Responsibility Open Closed Liskovsches Substitutionsprinzip Interface Segregation Dependency InversionWeitere Prinzipien Gesetz von Demeter Design by Contract Datenkapselung Linguistic Modular Units Self Documentation Uniform Access Single Choice Persistence Closure Command Query SeparationPackaging Prinzipien Reuse Release Equivalence Common Closure Common Reuse Acyclic Dependencies Stable Dependencies Stable Abstractions Abgerufen von https de wikipedia org w index php title Liskovsches Substitutionsprinzip amp oldid 212753720