Eine sehr einfache ErklÀrung der SOLID-Prinzipien

Haftungsausschluss: Jeder kann, aber was bin ich schlimmer ?!

SOLID ist eine Reihe von Prinzipien fĂŒr die Organisation von Code. TatsĂ€chlich erklĂ€ren sie bestimmte Regeln, die Ihnen helfen, die Nerven und die Zeit Ihrer und anderer zu sparen. Oder sie können nicht helfen.

Versuchen wir, diese Prinzipien an den Fingern zu verstehen, ohne Codebeispiele und SMS.

S - Prinzip der Einzelverantwortung (SRP)

Es sollte nur einen Grund geben, die Klasse zu Ă€ndern („Eine Klasse sollte nur einen Grund haben, die Klasse zu Ă€ndern.“ Robert C. Martin.)
Stellen Sie sich vor, Sie haben fĂŒnf Lieblingslieder, ein paar Filme und Bilder von Katzen auf Ihrem Computer. Sie bringen all dies in „Eigene Dateien“ und genießen im Allgemeinen das Leben.

Dann laden Sie weitere Filme, ein neues Album Ihrer Lieblingsband und ein Dutzend neue Katzen herunter. In "Meine Dokumente" wird es irgendwie unangenehm und Sie legen alles von Papa aus.

  Musik
 Filme
 Dichtungen 

Dann verbinden Sie eine unbegrenzte Geschwindigkeit, steigen aus den Spulen und laden alle Simpsons-Serien mit Diskografien Ihrer Lieblingsgruppen herunter. Fotos von einem Angelausflug mit Freunden werden zu den Fotos von Katzen hinzugefĂŒgt. VĂ€ter beginnen sich zu verzweigen.

  Musik
   Die TĂŒren
     Warten auf die Sonne
       Hallo, ich liebe dich.mp3
       ...
     ...
   Rhcp
   Agutin
 Video
   Fernsehsendungen
   Filme
   Privates Studio
 Foto
   Dichtungen
   Angeln
   PrÀferenz im Land
   Kurtisanen

Und was haben wir hier?

  • Musik - ist NUR fĂŒr Musik verantwortlich.
  • The Doors - NUR verantwortlich fĂŒr Musik von The Doors
  • Warten auf die Sonne - NUR verantwortlich fĂŒr das Album Waiting for the Sun.
  • Hallo, ich liebe dich.mp3 - NUR verantwortlich fĂŒr das Lied Hallo, ich liebe dich

Was könnte der Grund fĂŒr die Änderung in The Doors sein? Nur eine - (qualitative oder quantitative) Änderung in den Songs von The Doors. Das Entfernen einer langweiligen Serie aus "/ Video / TV Series /" kann jedoch kein solcher Grund sein, wie das Umbenennen von "Musik" in "Musik".

Welche Schlussfolgerungen können gezogen werden?

  1. Bei SRP geht es um Zerlegung (sortiert in Unterordner) und Verbundenheit ("Hallo, ich liebe dich.mp3" ist nur mit "Warten auf die Sonne" verbunden und sie kĂŒmmert sich nicht um Änderungen an "../Series". Andererseits alle Songs "The Doors" befinden sich darin und sollten sich nicht im Ordner "Cats" befinden.
  2. Der Abstraktionsgrad des Grundes fĂŒr die Änderung sollte nicht höher sein als der Abstraktionsgrad der zu Ă€ndernden EntitĂ€t. Das HinzufĂŒgen des Unterordners "Alla Pugacheva" zu "Musik" kann in keiner Weise der Grund fĂŒr die Änderung "Warten auf die Sonne" sein.
  3. Keine Notwendigkeit, auf den Punkt der AbsurditĂ€t zu bringen. Wenn Sie drei Songs, ein Video und fĂŒnf Bilder von Katzen haben, sehen sie auf einem Haufen großartig aus - wenn Sie sie in Ordner legen, wird alles nur verwirrt. Wie bei der Sammlung „The best of The Doors“ sollten Sie sie nicht nach Jahr in Unterordner unterteilen, von denen jeder einen Song enthĂ€lt.

O - Open-Closed-Prinzip oder OCP

Software-EntitĂ€ten (Klassen, Module, Funktionen usw.) sollten zur Erweiterung geöffnet, aber zur Änderung geschlossen sein. " Bertrand Meyer)
Kehren wir zum Schritt unserer Geschichte zurĂŒck, als Sie die Geschwindigkeit unbegrenzt verbunden haben. Nehmen wir an, Sie haben zunĂ€chst alle Arten von Filmen ĂŒber Klempner der Filmfirma Private aufgepumpt und, da es sich ausschließlich um Klempner handelte, den Ordner "/ Video / About Plumbers /" erstellt.

Nach einiger Zeit haben Sie weitere Filme aus diesem Studio heruntergeladen, aber bereits ĂŒber die Lieferung von Pizza. Außerdem hat dir dein neues MĂ€dchen eine SMS geschrieben: „Ich habe den Film„ Afonya “heruntergeladen und im Ordner / Video / About Plumbers / gespeichert, ok?“. Und alles scheint in Ordnung zu sein - ĂŒber Klempnerarbeiten, aber es gibt eine Nuance.
Und hier wird Ihnen klar, dass das Ändern der FunktionalitĂ€t unmöglich ist, ohne die vorhandene Struktur von Ordnern (Klassen) zu Ă€ndern, und dies ist ein klarer Verstoß gegen das OCP-Prinzip.

Wie musste in diesem Fall gemacht werden? Es ist sehr einfach, das System zunĂ€chst so zu gestalten, dass fĂŒr die neue FunktionalitĂ€t der alte Code nicht geĂ€ndert werden muss. Das heißt, Codieren Sie den Ordner "../Pro plumbers /" nicht fest, in der Hoffnung, dass es in Zukunft nur noch solche geben wird, sondern erhöhen Sie den Abstraktionsgrad auf "../Studio Private /" und fĂŒttern Sie sie ruhig sowohl mit Klempnern als auch mit Pizzaboten usw. -andere ...

Erstellen Sie fĂŒr Afoni eine neue Klasse, z. B. "../Mosfilm/", und erweitern Sie die Klasse "/ Video /".

Schlussfolgerungen:

  1. Überlegen Sie sich im Voraus, was Sie tun werden, wenn „andere“ Filme ĂŒber Klempner erscheinen. Vielleicht sollten Sie es sofort in Ihrem Kopf tun, um es spĂ€ter nicht zu wiederholen?
  2. Bei diesem Prinzip geht es hauptsÀchlich um abstrakte Klassen ("../Studio Private /").

L - Barbara Liskov Substitutionsprinzip oder LSP

Objekte im Programm mĂŒssen durch Instanzen ihrer Untertypen ersetzt werden können, ohne die korrekte AusfĂŒhrung des Programms zu Ă€ndern.
Hier ist es ganz einfach.

Wenden wir uns zur ErklĂ€rung der SĂŒĂŸe und KindermĂ€dchen zu, insbesondere dem Ordner "/ Photo / Seals /".
Wir lieben Katzen und haben viele Fotos gesammelt.

  Foto
   Dichtungen
     Rothaarige
     Gestreift
     Nass
     Schwarz
     Manula 


Es kommt vor, dass wir sogar direkt eine Diashow ĂŒber den gesamten Stammordner starten und sie bewundern. Und so wird in einem schönen Moment, wenn Sie fast das Nirvana erreicht haben, der Bildschirm angezeigt:
Datei "/ Foto / Siegel / BĂŒcher / Der gestiefelte Kater in Boots.fb2" kann nicht angezeigt werden.
Wie sich spĂ€ter herausstellte, hat Ihr Freund beschlossen, den Grad der Niedlichkeit zu erhöhen, und die „Siegel“ mit einem neuen Unterordner des „Buches“ geerbt, da er die LSP grob verletzt hat, da die Unterklasse „BĂŒcher“ nicht anstelle der Basisklasse „Foto“ verwendet werden kann.

Schlussfolgerungen:

  1. Der Name ist erschreckend, die Definition ist komplex, aber das Prinzip selbst ist einfach und intuitiv.
  2. Wenn Ihre Methode erwartet, dass "Foto" eingegeben wird, sollte es keine Rolle spielen, welchen Erben von "Foto" Sie ihm geben: "Manuli", "Rothaarige" oder "Nass", aber wenn "BĂŒcher" dazu kommt, dann Es wurde erwartet, dass er am Tee erstickte.

I - Interface Segregation Principle oder ISP

Clients sollten nicht von Methoden abhÀngig sein, die sie nicht verwenden.
Hier wird es schwierig sein, mit Ordnern und Dateien zu erklÀren, aber ich werde versuchen - nicht streng nach Spannungen zu urteilen.

Sie haben den Standard-Musikplayer satt und haben beschlossen, einen neuen, trendigen und Hype-Player herunterzuladen. Er weiß sogar, wie man das Cover eines Musikalbums und Untertitel eines gespielten Songs anzeigt. Das Problem ist jedoch, dass der Player mit einem Fehler abstĂŒrzt, wenn sich die Dateien "cover.jpg" und "subtitles.txt" nicht im Albumordner befinden. Und jetzt, da Sie alles auf der Welt verfluchen, beginnen Sie, diese Stub-Dateien in allen Unterordnern mit Alben zu erstellen.

Das heißt, wir haben die Musikklasse und alle ihre Erben verpflichtet, die AudioCoverSubtitles-Schnittstelle zu implementieren, da wir falsche Analogien gezogen haben. Gleichzeitig implementiert diese BenutzeroberflĂ€che nur das Album "Waiting for the Sun" vollstĂ€ndig, das Album "The Best of The Doors" implementiert nur den Audio + Cover-Teil und den Rest nur Audio.

Dies fĂŒhrt uns zu der Idee, dass es sinnvoll ist, die dicke AudioCoverSubtitles-OberflĂ€che in drei kleine Audio-, Cover- und Untertitel zu unterteilen und sie nur dort zu verwenden, wo sie wirklich benötigt werden.

Schlussfolgerungen:

  1. Beim ISP geht es plötzlich um die Trennung von Schnittstellen.
  2. Wenn Ihre Schnittstelle Sie zwingt, Stub-Methoden zu erstellen, ist dies eine schlechte Schnittstelle, und Sie sollten sie mit einer Schere durchgehen.

D - AbhÀngigkeitsinversionsprinzip oder DIP


Module der oberen Ebene sollten nicht von Modulen der unteren Ebene abhÀngen. Beide Modultypen sollten von Abstraktionen abhÀngen.

Abstraktionen sollten nicht von den Details abhÀngen. Details sollten von Abstraktionen abhÀngen.
Das Modul „TĂŒren“ sollte nicht davon abhĂ€ngen, welche Art von Audiodateien es enthĂ€lt, .mp3, .flac oder .wav.

Das Doors-Modul, das Submodul Waiting for the Sun (und alle anderen), hÀngt von der Abstraktion der Musik auf oberster Ebene ab, die ihre Implementierung bestimmt (die Tatsache, dass sie Musik enthalten).

Angenommen, wir haben beschlossen, die Speicherung von Musik nach dem Prinzip der Komprimierung zu trennen - "verlustbehaftet" und "verlustfrei". Dies sind die Details, die die AbhĂ€ngigkeit von der Abstraktion „Musik“ verbindet - in ihnen muss es letztendlich noch Musik geben. DarĂŒber hinaus hĂ€ngt die Abstraktion „Musik“ selbst nicht von diesen Details ab. Es ist ihr egal, ob die Musik dort oder ohne sie verloren geht - wie es Musik war, bleibt es so.

Schlussfolgerungen:

  1. DIP - es geht darum, das Besondere sollte vom Allgemeinen abhÀngen und nicht umgekehrt.
  2. DIP ist "Mehr Abstraktionen fĂŒr den Gott der Abstraktionen!"
  3. Bei DIP geht es auch um Ursachen und Wirkungen, um die richtige Antwort auf die Frage: „Zweige schwingen aufgrund der Tatsache, dass der Wind weht, oder der Wind weht aufgrund der Tatsache, dass die Zweige schwingen.“

Vielen Dank und ein schönes Wochenende!

Source: https://habr.com/ru/post/de413707/


All Articles