bg_image
header

Liskov Substitution Principle

Das Liskov Substitution Principle (LSP) ist ein weiteres fundamentales Prinzip der SOLID-Prinzipien in der objektorientierten Programmierung. Es wurde von der Informatikerin Barbara Liskov formuliert und legt die Bedingungen fest, unter denen Subtypen (Unterklassen) in einem Programm korrekt die Basistypen (Superklassen) ersetzen können.

Das Prinzip besagt, dass Objekte einer Basisklasse durch Objekte einer abgeleiteten (Unter-)Klasse ersetzt werden können, ohne die Funktionalität des Programms zu beeinträchtigen. Mit anderen Worten sollte ein Subtyp in der Lage sein, alle Verträge und Verhaltensweisen des Basistyps einzuhalten, ohne unerwartetes oder fehlerhaftes Verhalten zu verursachen.

Die Kernidee des Liskov Substitution Principle besteht darin, dass Subtypen eine erweiterebare Version der Basistypen sein sollten, wobei sie die gleichen Vorbedingungen (Eingabebedingungen) und Nachbedingungen (Ausgabebedingungen) erfüllen wie ihre Basistypen. Mit anderen Worten:

  1. Die Methodenaufrufe, die auf einem Objekt des Basistyps funktionieren, müssen auch auf einem Objekt eines Subtyps funktionieren, ohne dass der Aufrufer von der spezifischen Implementierung wissen muss.

  2. Die Rückgabewerte der Methoden eines Subtyps sollten mit den Rückgabewerten der entsprechenden Methoden des Basistyps kompatibel sein.

  3. Die Vorbedingungen (Eingabebedingungen) einer Methode eines Subtyps sollten nicht stärker sein als die Vorbedingungen der entsprechenden Methode des Basistyps.

  4. Die Nachbedingungen (Ausgabebedingungen) einer Methode eines Subtyps sollten nicht schwächer sein als die Nachbedingungen der entsprechenden Methode des Basistyps.

Eine korrekte Anwendung des LSP stellt sicher, dass der Code, der auf die Basisklasse zugreift, mit allen abgeleiteten Klassen funktioniert, ohne dass der Code modifiziert werden muss. Es verbessert die Flexibilität und Erweiterbarkeit des Codes und fördert eine konsistente und robuste Softwarearchitektur.

Nichteinhaltung des Liskov Substitution Principle kann zu schwerwiegenden Problemen führen, wie unerwartetem Verhalten, Laufzeitfehlern oder inkorrekten Ergebnissen, da die Annahmen über die Basisklasse nicht für die Subtypen gelten würden. Daher ist es wichtig, das LSP bei der Erstellung von Klassen und der Definition von Vererbungshierarchien sorgfältig zu beachten, um die Integrität und Funktionsweise des Programms zu gewährleisten.


Open-Closed Principle

Das Open/Closed Principle (OCP) ist ein weiteres wichtiges Prinzip der SOLID-Prinzipien in der objektorientierten Programmierung und Softwareentwicklung. Es wurde von Bertrand Meyer eingeführt und später von Robert C. Martin als Teil des SOLID-Prinzipienkatalogs weiterentwickelt.

Das Prinzip besagt, dass Software-Entitäten wie Klassen, Module, Funktionen usw. offen für Erweiterungen, aber geschlossen für Modifikationen sein sollten. Mit anderen Worten sollte der Code so gestaltet sein, dass neue Funktionalitäten hinzugefügt werden können, ohne den bestehenden Code zu ändern. Bestehender Code sollte geschützt und stabil bleiben, während neue Funktionen nahtlos hinzugefügt werden können.

Es gibt verschiedene Techniken, um das OCP zu erreichen:

  1. Vererbung: Durch Vererbung können neue Funktionalitäten durch Erweiterung einer Basisklasse hinzugefügt werden, ohne den vorhandenen Code zu ändern. Dies wird erreicht, indem neue Unterklassen erstellt werden, die von der Basisklasse erben und die gewünschten Änderungen oder Erweiterungen implementieren.

  2. Abstrakte Klassen und Interfaces: Das Definieren von abstrakten Klassen oder Schnittstellen ermöglicht es, allgemeine Verträge oder Verhaltensweisen festzulegen, die von konkreten Klassen implementiert werden. Neue Funktionen können durch das Hinzufügen neuer konkreter Klassen erreicht werden, die die abstrakten Klassen oder Interfaces implementieren, ohne die bestehenden Klassen zu ändern.

  3. Dependency Injection: Durch das Anwenden des Dependency-Inversion-Prinzips (DIP) können neue Funktionen hinzugefügt werden, indem neue Abhängigkeiten übergeben werden, anstatt den bestehenden Code zu ändern. Dies ermöglicht eine Lockerung der Kopplung zwischen den Komponenten und erleichtert das Hinzufügen neuer Funktionen.

Das OCP ist von großer Bedeutung, da es die Flexibilität und Erweiterbarkeit von Software erhöht und dazu beiträgt, die Gefahr von Fehlern durch Änderungen an vorhandenem Code zu reduzieren. Indem der bestehende Code geschlossen für Modifikationen bleibt, wird auch die Wahrscheinlichkeit von Regressionen und unerwarteten Seiteneffekten minimiert.

Es ist wichtig zu beachten, dass das OCP nicht bedeutet, dass überhaupt keine Änderungen am Code vorgenommen werden sollten. Es geht vielmehr darum, Änderungen zu minimieren, indem der Code so organisiert wird, dass er für Erweiterungen offen bleibt, ohne den bestehenden funktionsfähigen Code zu gefährden.


Single-Responsibility-Prinzip

Das Single Responsibility Principle (SRP), auf Deutsch "Prinzip der einzigen Verantwortlichkeit", ist eines der grundlegenden Prinzipien des SOLID-Prinzipienkatalogs in der Softwareentwicklung. Es wurde von Robert C. Martin vorgestellt und ist eines der wichtigsten Konzepte zur Erreichung einer guten Softwarearchitektur.

Das Prinzip besagt, dass eine Klasse oder ein Modul in einem Programm nur eine einzige Verantwortlichkeit haben sollte. Mit anderen Worten sollte eine Klasse nur für eine bestimmte Aufgabe oder Funktionalität zuständig sein. Wenn es mehr als eine Verantwortlichkeit gibt, wird die Klasse anfällig für Änderungen, die eine der Verantwortlichkeiten betreffen, und es besteht die Gefahr, dass sich Änderungen an einer Verantwortlichkeit negativ auf andere Verantwortlichkeiten auswirken.

Ein Beispiel, um das SRP zu verdeutlichen, wäre eine Klasse, die sowohl für die Datenbankverbindung als auch für die Berechnung komplexer mathematischer Operationen verantwortlich ist. Dies wäre ein Verstoß gegen das SRP, da die Klasse zwei verschiedene Verantwortlichkeiten hat, die unabhängig voneinander sein sollten. Stattdessen sollten diese Funktionen in separate Klassen aufgeteilt werden, sodass jede Klasse nur für eine der Verantwortlichkeiten zuständig ist.

Die Vorteile des SRP sind vielfältig:

  1. Bessere Lesbarkeit und Verständlichkeit: Eine Klasse mit nur einer Verantwortlichkeit ist einfacher zu verstehen, da sie sich nur auf eine spezifische Funktionalität konzentriert.

  2. Einfachere Wartung und Änderung: Wenn eine Klasse nur eine Verantwortlichkeit hat, führen Änderungen an dieser Verantwortlichkeit nicht zu unerwarteten Seiteneffekten in anderen Teilen des Codes.

  3. Erhöhte Wiederverwendbarkeit: Gut abgegrenzte Klassen mit einer einzigen Verantwortlichkeit können leichter in anderen Projekten wiederverwendet werden.

  4. Bessere Testbarkeit: Klassen mit klar definierten Verantwortlichkeiten lassen sich einfacher isolieren und somit besser testen.

Das SRP ist eng mit anderen SOLID-Prinzipien verbunden, insbesondere dem "Open/Closed Principle" (OCP) und dem "Dependency Inversion Principle" (DIP). Durch die Einhaltung des SRP wird die Wahrscheinlichkeit erhöht, dass der Code offen für Erweiterungen ist (OCP), da Änderungen nur die spezifische Klasse betreffen sollten. Zudem unterstützt das SRP das DIP, indem es die Abhängigkeiten zwischen Klassen reduziert und somit die Flexibilität und Wartbarkeit der Anwendung verbessert.


SOLID

SOLID ist ein Akronym, das fünf Designprinzipien in der objektorientierten Programmierung und Softwareentwicklung repräsentiert. Diese Prinzipien wurden von Robert C. Martin eingeführt, um eine wartbare, skalierbare und flexible Softwarearchitektur zu fördern. Jeder Buchstabe im Akronym steht für ein bestimmtes Prinzip:

  1. Single Responsibility Principle (SRP): Eine Klasse sollte nur einen Grund zur Änderung haben, das heißt, sie sollte nur eine Verantwortlichkeit haben. Dieses Prinzip fördert die Trennung von Anliegen und stellt sicher, dass jede Klasse sich darauf konzentriert, eine Sache gut zu erledigen.

  2. Open/Closed Principle (OCP): Software-Entitäten (Klassen, Module, Funktionen usw.) sollten für Erweiterungen offen, aber für Änderungen geschlossen sein. Dieses Prinzip ermöglicht das Hinzufügen neuer Funktionen, ohne den bestehenden Code zu ändern, fördert die Wiederverwendung von Code und minimiert das Risiko, Fehler einzuführen.

  3. Liskov Substitution Principle (LSP): Objekte einer Superklasse sollten durch Objekte ihrer Unterklassen ersetzbar sein, ohne die Korrektheit des Programms zu beeinträchtigen. Mit anderen Worten sollten Unterklassen austauschbar mit ihren Basisklassen sein.

  4. Interface Segregation Principle (ISP): Clients sollten nicht gezwungen sein, von Schnittstellen abhängig zu sein, die sie nicht verwenden. Dieses Prinzip schlägt vor, dass kleinere, fokussiertere Schnittstellen besser sind als große, allgemeine Schnittstellen, um zu verhindern, dass Clients mit unnötigen Methoden belastet werden.

  5. Dependency Inversion Principle (DIP): Module der oberen Ebene sollten nicht von Modulen der unteren Ebene abhängen; beide sollten von Abstraktionen abhängen. Abstraktionen sollten nicht von Details abhängen, sondern Details sollten von Abstraktionen abhängen. Dieses Prinzip fördert den Einsatz von Schnittstellen und Dependency Injection, um Klassen zu entkoppeln und die Flexibilität zu erhöhen.

Indem man diesen SOLID-Prinzipien folgt, können Entwickler eine wartbare, modulare und robuste Software erstellen, die im Laufe der Zeit leichter erweitert und geändert werden kann.