
Ich treffe hĂ€ufig auf Entwickler, die noch nie von den SOLID-Prinzipien gehört haben (wir . â Anm. d. Red.) oder objekorientierter Programmierung (OOP), oder die davon gehört haben, sie aber nicht praktisch anwenden. In diesem Artikel werden die Vorteile der OOP-Prinzipien beschrieben, die Entwicklern in ihrem tĂ€glichen Arbeiten helfen. Einige von ihnen sind gut bekannt, andere weniger, sodass der Artikel sowohl fĂŒr AnfĂ€nger als auch fĂŒr erfahrene Programmierer nĂŒtzlich sein wird.
Wir erinnern daran: FĂŒr alle Leser von "Habr" gibt es einen Rabatt von 10.000 Rubel bei der Anmeldung zu einem beliebigen Kurs von Skillbox mit dem Rabattcode "Habr".
Skillbox empfiehlt: Online-Bildungskurs .
DRY (Donât Repeat Yourself)
Ein recht einfaches Prinzip, dessen Inhalt sich aus dem Namen ableitet: "Wiederhole dich nicht". FĂŒr Programmierer bedeutet das, dass du redundanten Code vermeiden und Abstraktion in der Arbeit nutzen solltest.
Wenn es im Code zwei sich wiederholende Abschnitte gibt, sollten diese in eine Methode zusammengefasst werden. Wenn ein festgelegter Wert mehr als einmal verwendet wird, sollte er in eine öffentliche Konstante umgewandelt werden.
Dies dient dazu, den Code zu vereinfachen und dessen Wartung zu erleichtern, was das Hauptziel der OOP ist. Man sollte auch nicht ĂŒbertreiben, denn derselbe Code wird sowohl mit OrderId als auch mit SSN nicht bestehen können.
Kapselung von Ănderungen
Die Softwareprodukte der meisten Unternehmen unterliegen stĂ€ndigen Weiterentwicklungen. Das bedeutet, dass Ănderungen am Code vorgenommen und dieser gewartet werden muss. Die Kapselung kann hierbei helfen, das Leben zu erleichtern. Sie ermöglicht eine effizientere Testung und Wartung des bestehenden Codes. .
Wenn Sie in Java programmieren, .
Prinzip der Offenheit/SchlieĂung
Dieses Prinzip lĂ€sst sich leicht merken, wenn Sie die folgende Aussage lesen: âProgrammierobjekte (Klassen, Module, Funktionen usw.) sollten offen fĂŒr Erweiterungen, aber geschlossen fĂŒr Ănderungen sein.â In der Praxis bedeutet dies, dass sie ihr Verhalten Ă€ndern können, ohne den Quellcode zu modifizieren.
Das Prinzip ist wichtig, wenn Ănderungen am Quellcode eine Ăberarbeitung, Modultests und andere Verfahren erfordern. Code, der dem Prinzip der Offenheit/SchlieĂung folgt, verĂ€ndert sich nicht bei Erweiterungen, daher gibt es damit wesentlich weniger Probleme.
Hier ist ein Beispiel fĂŒr Code, der dieses Prinzip verletzt.

Wenn Ănderungen erforderlich sind, kann dies viel Zeit in Anspruch nehmen, da alle Codeteile angepasst werden mĂŒssen, die mit dem fraglichen Abschnitt verbunden sind.
Ăbrigens ist das Prinzip der Offenheit/SchlieĂung eines der SOLID-Prinzipien.
Das Prinzip der einzelnen Verantwortung (SRP)
Ein weiteres Prinzip aus der SOLID-Gruppe. Es besagt, dass "es nur einen Grund gibt, warum eine Klasse geĂ€ndert werden sollte." Eine Klasse hat nur eine Aufgabe. Sie kann mehrere Methoden haben, aber jede dient nur zur Lösung einer gemeinsamen Aufgabe. Alle Methoden und Eigenschaften sollten ausschlieĂlich diesem Zweck dienen.

Der Wert dieses Prinzips besteht darin, dass es die Verbindung zwischen einer einzelnen Softwarekomponente und dem Code schwĂ€cht. Wenn mehr als eine FunktionalitĂ€t in eine Klasse eingefĂŒgt wird, entsteht eine Verbindung zwischen den beiden Funktionen. Wenn eine von ihnen geĂ€ndert wird, besteht eine groĂe Wahrscheinlichkeit, dass die zweite, die mit der ersten verbunden ist, beeintrĂ€chtigt wird. Das bedeutet eine Erhöhung der Testzyklen, um alle Probleme im Voraus zu identifizieren.
Prinzip der AbhÀngigkeitsinversion (DIP)

Oben finden Sie ein Codebeispiel, in dem der AppManager vom EventLogWriter abhÀngt, der wiederum eng mit dem AppManager verbunden ist. Wenn eine andere Möglichkeit zur Anzeige einer Benachrichtigung erforderlich ist, sei es Push, SMS oder E-Mail, muss die Klasse AppManager geÀndert werden.
Das Problem kann mit DIP gelöst werden. Statt den AppManager anzufordern, fragen wir den EventLogWriter an, der ĂŒber das 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
Die beiden Hauptmethoden zur Wiederverwendung von Code sind Vererbung und Komposition, wobei jede sowohl Vorteile als auch Nachteile hat. Ăblicherweise wird der zweiten Methode der Vorzug gegeben, da sie 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 kommt Polymorphie zur Anwendung, die eine flexiblere Umsetzung ermöglicht.
Sogar "Effective Java" von Joshua Bloch empfiehlt, der Komposition den Vorzug vor der Vererbung zu geben.
Das Liskov-Substitutionsprinzip (LSP)
Ein weiteres Prinzip aus dem SOLID-Werkzeugkasten. Es besagt, dass Untertypen durch ihren Supertyp ersetzt werden können. Das bedeutet, dass Methoden und Funktionen, die mit der Superklasse arbeiten, problemlos auch mit ihren Unterklassen arbeiten sollten.
Das LSP steht sowohl im Zusammenhang mit dem Prinzip der Einzelverantwortung als auch mit dem Prinzip der Aufteilung der Verantwortung. Wenn eine Klasse mehr FunktionalitĂ€t bietet als die Unterklasse, wird diese einige Funktionen nicht unterstĂŒtzen, was dieses Prinzip verletzt.
Hier ist ein Codeabschnitt, der dem LSP widerspricht.

Die Methode area(Rectangle r) berechnet die FlĂ€che eines Rechtecks. Das Programm wird nach der AusfĂŒhrung von Square abgebrochen, da Square hier kein Rechteck ist. Laut dem Liskovâschen Substitutionsprinzip sollten Funktionen, die Referenzen auf Basisklassen verwenden, in der Lage sein, auch Objekte abgeleiteter Klassen ohne zusĂ€tzliche Anweisungen zu verwenden.
Dieses Prinzip, das eine spezifische Definition eines Subtyps darstellt, wurde 1987 von Barbara Liskov auf einer Konferenz in einem Hauptvortrag mit dem Titel âDatenabstraktion und Hierarchieâ vorgestellt â daher der Name.
Prinzip der Schnittstellentrennung (ISP)
Ein weiterer SOLID-Prinzip. Demnach sollte eine nicht verwendete Schnittstelle nicht implementiert werden. Die Einhaltung dieses Prinzips hilft dem System, flexibel zu bleiben und eine einfache Refaktorisierung bei Ănderungen an den Arbeitslogiken zu ermöglichen.
Diese Situation tritt hÀufig auf, wenn eine Schnittstelle mehrere Funktionen enthÀlt und der Kunde nur eine davon benötigt.
Da das Schreiben einer Schnittstelle eine komplexe Aufgabe ist, wird es problematisch sein, sie nach Abschluss der Arbeit zu Àndern, ohne etwas zu stören.
Ein 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 Anzahl der Methoden zu reduzieren.

Programmierung fĂŒr das Interface, nicht fĂŒr die Implementierung
Hier ist alles im Namen klar. Die Anwendung dieses Prinzips fĂŒhrt zur Erstellung flexibler Codes, der mit jeder neuen Implementierung des Interfaces arbeiten kann.
Es sollte der Typ des Interfaces fĂŒr Variablen, RĂŒckgabetypen oder den Argumenttyp einer Methode verwendet werden. Beispiel â Verwendung von SuperClass und nicht von SubClass.
Das bedeutet:
List numbers = getNumbers();
Nicht:
ArrayList numbers = getNumbers();
Hier ist eine praktische Umsetzung dessen, was oben beschrieben wurde.

Das Delegationsprinzip
Ein verbreitetes Beispiel sind die Methoden equals() und hashCode() in Java. Wenn zwei Objekte verglichen werden sollen, wird diese Aktion an die entsprechende Klasse delegiert, anstatt an die Clientklasse.
Ein Vorteil des Prinzips besteht darin, dass Code-Duplizierung vermieden wird und das Verhalten relativ einfach geÀndert werden kann. Es ist auch auf die Delegierung von Ereignissen anwendbar.

All diese Prinzipien ermöglichen es, flexibleren, schöneren und zuverlĂ€ssigeren Code mit hoher KohĂ€sion und geringem Coupling zu schreiben. NatĂŒrlich ist die Theorie wichtig, aber um sicherzustellen, dass ein Entwickler die erworbenen Kenntnisse tatsĂ€chlich anwendet, ist praktische Erfahrung erforderlich. Der nĂ€chste Schritt nach dem Erlernen der OOP-Prinzipien könnte das Studium von Entwurfsmustern sein, um hĂ€ufige Softwareentwicklungsprobleme zu lösen.
Skillbox empfiehlt:
- Praktischer Kurs .
- Angewandter Online-Kurs .
- ZweijÀhriger praktischer Kurs .
Quelle: habr.com
