
Ich treffe ziemlich oft auf Entwickler, die noch nie von den SOLID-Prinzipien gehört haben (wir . â Anm. d. Red.) oder von objektorientierter Programmierung (OOP), oder sie haben davon gehört, verwenden sie aber nicht in der Praxis. In diesem Artikel werden die Vorteile der OOP-Prinzipien beschrieben, die Entwicklern in ihrer tĂ€glichen Arbeit helfen. Einige davon sind gut bekannt, andere weniger, sodass der Artikel sowohl fĂŒr Neulinge als auch fĂŒr erfahrene Programmierer nĂŒtzlich sein wird.
Wir erinnern daran: fĂŒr alle Leser von âHabrâ â 10.000 Rubel Rabatt bei der Buchung eines beliebigen Skillbox-Kurses mit dem Promo-Code âHabrâ.
Skillbox empfiehlt: Online-Kurs .
DRY (Donât Repeat Yourself)
Ein ziemlich einfaches Prinzip, dessen Wesensart aus dem Namen klar ist: âWiederhole dich nichtâ. FĂŒr Programmierer bedeutet dies, dass dualer Code vermieden werden sollte, und auch die Möglichkeit gegeben sein muss, Abstraktionen im Arbeitsprozess zu nutzen.
Wenn im Code zwei sich wiederholende Abschnitte vorhanden sind, sollten diese in einer Methode zusammengefasst werden. Wenn ein festgelegter Wert mehr als einmal verwendet wird, sollte er in eine öffentliche Konstante umgewandelt werden.
Das ist notwendig, um den Code zu vereinfachen und seine Wartung zu erleichtern, was das Hauptziel der OOP ist. Man sollte jedoch nicht ĂŒbertreiben, da derselbe Code nicht sowohl mit OrderId als auch mit SSN bestehen kann.
Kapselung von Ănderungen
Softwareprodukte der meisten Unternehmen entwickeln sich stĂ€ndig weiter. Das bedeutet, dass Ănderungen am Code vorgenommen werden mĂŒssen und er gewartet werden muss. Man kann sich das Leben durch Kapselung erleichtern. Dies ermöglicht eine effizientere Testung und Wartung des bestehenden Codes. .
Wenn Sie in Java programmieren, dann .
Prinzip der Offenheit/Abgeschlossenheit
Dieses Prinzip lĂ€sst sich leicht merken, wenn man die folgende Aussage liest: âSoftwareeinheiten (Klassen, Module, Funktionen usw.) sollten fĂŒr Erweiterungen offen, aber fĂŒr Ănderungen geschlossen sein.â Praktisch bedeutet dies, dass sie es ermöglichen sollten, ihr Verhalten zu Ă€ndern, ohne den Quellcode zu verĂ€ndern.
Das Prinzip ist wichtig, wenn Ănderungen im Quellcode eine ĂberprĂŒfung, modulare Tests und andere Verfahren erfordern. Code, der dem Open/Closed-Prinzip entspricht, wird beim Erweitern nicht verĂ€ndert, weshalb es mit ihm viel weniger Probleme gibt.
Hier ist ein Beispiel fĂŒr Code, der dieses Prinzip verletzt.

Wenn etwas daran geĂ€ndert werden muss, wird dies viel Zeit in Anspruch nehmen, da alle Codeabschnitte, die mit dem relevanten Fragment verbunden sind, geĂ€ndert werden mĂŒssen.
Ăbrigens ist das Open/Closed-Prinzip eines der SOLID-Prinzipien.
Prinzip der einzelnen Verantwortung (SRP)
Ein weiteres Prinzip aus dem SOLID-Set. Es besagt, dass âes nur einen Grund gibt, der zu einer Ănderung der Klasse fĂŒhrtâ. Eine Klasse erfĂŒllt nur eine Aufgabe. Sie kann mehrere Methoden haben, die jedoch alle nur zur Lösung einer allgemeinen Aufgabe dienen. Alle Methoden und Eigenschaften sollten nur diesem Zweck dienen.

Der Wert dieses Prinzips liegt darin, dass es die Verbindung zwischen einer einzelnen Softwarekomponente und dem Code schwĂ€cht. Wenn mehr als eine FunktionalitĂ€t in eine Klasse eingefĂŒhrt wird, wird eine Verbindung zwischen zwei Funktionen hergestellt. Wenn man also eine von ihnen Ă€ndert, besteht eine hohe Wahrscheinlichkeit, dass man die zweite, die mit der ersten verbunden ist, beschĂ€digt. Das bedeutet, dass die Testzyklen erhöht werden mĂŒssen, um alle Probleme im Voraus zu erkennen.
Prinzip der AbhÀngigkeitsinversion (DIP)

Das oben gezeigte Codebeispiel zeigt, dass der AppManager von EventLogWriter abhÀngt, der wiederum eng mit dem AppManager verbunden ist. Wenn ein anderer Weg benötigt wird, um Benachrichtigungen anzuzeigen, sei es Push, SMS oder E-Mail, muss die Klasse AppManager geÀndert werden.
Das Problem kann mit Hilfe des DIP gelöst werden. Statt den AppManager zu verwenden, fordern wir den EventLogWriter an, der ĂŒber ein Framework eingefĂŒhrt wird.
DIP ermöglicht es, einzelne Module problemlos durch andere zu ersetzen, indem das AbhÀngigkeitsmodul geÀndert wird. Dies ermöglicht es, ein Modul zu Àndern, ohne die anderen zu beeinflussen.
Komposition statt Vererbung
Es gibt zwei Hauptwege, um Code wiederzuverwenden: Vererbung und Komposition, wobei jede ihre eigenen Vor- und Nachteile hat. In der Regel wird der zweiten der Vorzug gegeben, da er flexibler ist.
Die Komposition ermöglicht es, das Verhalten einer Klasse zur Laufzeit durch das Setzen ihrer Eigenschaften zu Àndern. Bei der Implementierung von Schnittstellen wird Polymorphismus verwendet, der eine flexiblere Implementierung bietet.
Selbst in âEffective Javaâ von Joshua Bloch wird empfohlen, die Komposition dem Vererben vorzuziehen.
Das Liskov-Substitutionsprinzip (LSP)
Ein weiteres Prinzip aus dem SOLID-Werkzeugkasten. Es besagt, dass Subtypen durch ihren Supertyp ersetzt werden können. Das heiĂt, Methoden und Funktionen, die mit der Superklasse arbeiten, sollten auch problemlos mit ihren Unterklassen funktionieren.
Das LSP hĂ€ngt sowohl mit dem Prinzip der individuellen Verantwortung als auch mit dem Prinzip der Trennung der Verantwortlichkeiten zusammen. Wenn eine Klasse mehr FunktionalitĂ€t bietet als die Unterklasse, wird diese einige Funktionen nicht unterstĂŒtzen, wodurch dieses Prinzip verletzt wird.
Hier ist ein Codeabschnitt, der gegen das LSP verstöĂt.

Die Methode area(Rectangle r) berechnet die FlĂ€che des Rechtecks. Das Programm wird nach der AusfĂŒhrung von Square abstĂŒrzen, da Square hier kein Rechteck ist. Laut LSP mĂŒssen Funktionen, die Referenzen auf Basisklassen verwenden, in der Lage sein, auch Objekte von abgeleiteten Klassen ohne zusĂ€tzliche Anweisungen zu verwenden.
Dieses Prinzip, das eine spezifische Definition des Subtyps ist, wurde 1987 von Barbara Liskov in einem Hauptvortrag auf einer Konferenz mit dem Titel âDatenabstraktion und Hierarchieâ vorgeschlagen â daher der Name.
Das Prinzip der Trennung der Schnittstelle (ISP)
Ein weiteres SOLID-Prinzip. Es besagt, dass eine Schnittstelle, die nicht verwendet wird, nicht implementiert werden sollte. Dieses Prinzip zu befolgen hilft, das System flexibel zu halten und fĂŒr Refactoring geeignet, wenn Ănderungen an der Logik vorgenommen werden.
Diese Situation tritt hÀufig auf, wenn eine Schnittstelle mehrere FunktionalitÀten enthÀlt und der Kunde nur eine davon benötigt.
Da das Schreiben einer Schnittstelle eine komplexe Aufgabe ist, wird es ein Problem sein, sie nach Abschluss der Arbeit zu Àndern, ohne etwas zu verletzen.
Der Vorteil des ISP-Prinzips in Java ist, dass zuerst alle Methoden implementiert werden mĂŒssen, bevor sie von Klassen verwendet werden können. Daher ermöglicht das Prinzip die Reduzierung der Anzahl der Methoden.

Programmierung fĂŒr Schnittstellen und nicht fĂŒr Implementierungen
Hier ist alles klar aus dem Titel. Die Anwendung dieses Prinzips fĂŒhrt zur Schaffung flexibler Codes, die mit jeder neuen Implementierung der Schnittstelle arbeiten können.
Es sollte der Schnittstellentyp fĂŒr Variablen, RĂŒckgabetypen oder den Argumenttyp der Methode verwendet werden. Beispiel â Verwendung von SuperClass anstelle von SubClass.
Das heiĂt:
List numbers = getNumbers();
Nicht:
ArrayList numbers = getNumbers();
Hier ist die praktische Umsetzung dessen, was oben erwÀhnt wurde.

Das Delegierungsprinzip
Ein verbreitetes Beispiel sind die Methoden equals() und hashCode() in Java. Wenn zwei Objekte verglichen werden mĂŒssen, wird diese Aktion der entsprechenden Klasse und nicht dem Client ĂŒberlassen.
Der Vorteil des Prinzips ist die Vermeidung von Code-Duplikation und die relativ einfache Ănderung des Verhaltens. Es ist auch auf die Ereignisdelegierung anwendbar.

Alle diese Prinzipien ermöglichen es, flexibleren, schöneren und zuverlĂ€ssigeren Code mit hoher KohĂ€sion und niedriger Kopplung zu schreiben. NatĂŒrlich ist Theorie gut, aber damit der Entwickler das erworbene Wissen tatsĂ€chlich anwendet, ist Praxis erforderlich. Der nĂ€chste Schritt nach dem VerstĂ€ndnis der OOP-Prinzipien könnte das Studium von Designmustern zur Lösung allgemeiner Softwareentwicklungsprobleme sein.
Skillbox empfiehlt:
- Praktischer Kurs .
- Angewandter Online-Kurs .
- ZweijÀhriger praktischer Kurs .
Quelle: habr.com
