Avertissement: Tout le monde peut, mais qu'est-ce que je suis pire?!
SOLID est un ensemble de principes pour organiser le code. En fait, ils déclarent certaines règles qui vous aideront à économiser vos nerfs et votre temps. Ou ils peuvent ne pas aider.
Essayons de comprendre ces principes sur les doigts, sans exemples de code et SMS.
S - Principe de responsabilité unique (PRS)
Il devrait y avoir une et une seule raison pour changer de classe («Une classe ne devrait avoir qu'une seule raison de changer.» Robert C. Martin.)
Imaginez que vous avez cinq chansons préférées, quelques films et photos de chats sur votre ordinateur. Vous mettez tout cela dans «Mes documents» et, en général, vous profitez de la vie.
Ensuite, vous téléchargez plus de films, un nouvel album de votre groupe préféré et une douzaine de nouveaux chats. Dans «Mes documents», cela devient en quelque sorte inconfortable et vous disposez tout par papa.
La musique
Les films
Joints
Ensuite, vous connectez une vitesse illimitée, descendez des bobines et téléchargez toutes les séries Simpsons pleines de discographies de vos groupes préférés, et des photos d'un voyage de pêche avec des amis sont ajoutées aux photos de chats. Les papas commencent à se ramifier.
La musique
Les portes
En attendant le soleil
Bonjour, je t'aime.mp3
...
...
Rhcp
Agutin
Vidéo
Émissions de télévision
Les films
Studio privé
La photo
Joints
La pêche
Préférence dans le pays
courtisanes
Et qu'avons-nous ici?
- Musique - est SEULEMENT responsable de la musique.
- The Doors - SEULEMENT responsable de la musique jouée par The Doors
- Waiting for the Sun - responsable SEULEMENT de l'album Waiting for the Sun
- Bonjour, je t'aime.mp3 - SEULEMENT responsable de la chanson Bonjour, je t'aime
Quelle pourrait être la raison du changement dans The Doors? Un seul changement (qualitatif ou quantitatif) dans les chansons de The Doors. Mais la suppression d'une série ennuyeuse de "/ Video / TV Series /" ne peut pas être une telle raison, tout comme renommer "Music" en "Music".
Quelles conclusions peut-on en tirer?
- La SRP concerne la décomposition (triée en sous-dossiers) et la connectivité ("Hello, I Love You.mp3" est uniquement associée à "Waiting for the Sun" et elle ne se soucie pas des changements dans "../Series". Par contre, toutes les chansons «Les portes» sont à l'intérieur et ne doivent pas être dans le dossier «Chats»).
- Le niveau d'abstraction de la raison du changement ne doit pas être supérieur au niveau d'abstraction de l'entité en cours de modification. L'ajout du sous-dossier «Alla Pugacheva» à «Musique» ne peut en aucun cas être la raison du changement «En attendant le soleil».
- Pas besoin d'amener au point d'absurdité. Si vous avez trois chansons, une vidéo et cinq photos de chats, ils auront fière allure dans un seul tas - les glisser dans des dossiers ne fera que tout confondre. Comme la collection «The best of The Doors», vous ne devez pas la diviser en sous-dossiers par année, chacun ayant une chanson.
O - Principe ouvert-fermé ou OCP
Les entités logicielles (classes, modules, fonctions, etc.) doivent être ouvertes pour extension, mais fermées pour modification. " Bertrand Meyer)
Revenons à l'étape de notre histoire lorsque vous vous êtes connecté à une vitesse illimitée. Disons que vous avez tout d'abord pompé toutes sortes de films sur les plombiers de la société de cinéma Private et, comme ils étaient tous sur les plombiers, créé le dossier "/ Video / About Plumbers /".
Après un certain temps, vous avez téléchargé plus de films de ce studio, mais déjà sur la livraison de pizza. De plus, votre nouvelle fille vous a écrit un SMS «J'ai téléchargé le film« Afonya »et l'ai enregistré dans le dossier / Vidéo / About Plumbers /, ok?». Et tout semble bien se passer - sur la plomberie, mais il y a une nuance.
Et ici, il devient clair pour vous que la modification de la fonctionnalité est impossible sans modifier la structure existante des dossiers (classes), et c'est une violation claire du principe OCP.
Comment dans ce cas devait être fait? Il est très simple de concevoir initialement le système afin que la nouvelle fonctionnalité ne nécessite pas de changer l'ancien code. C'est-à-dire ne codez pas en dur le dossier "../Pro plumbers /", en espérant qu'à l'avenir il n'y en aura plus que cela, mais augmentez le niveau d'abstraction à "../Studio Private /" et nourrissez-le calmement les plombiers et les livreurs de pizza, etc. -autre ...
Et pour Afoni, créez une nouvelle classe, par exemple, "../Mosfilm/", en étendant la classe "/ Video /"
Conclusions:
- Réfléchissez à ce que vous ferez si des «autres» films sur les plombiers apparaissent. Peut-être que vous devriez le faire tout de suite dans votre esprit pour ne pas le refaire plus tard?
- Ce principe concerne principalement les classes abstraites ("../Studio Private /").
L - Principe de substitution Barbara Liskov ou LSP
Les objets du programme doivent être remplaçables par des instances de leurs sous-types sans modifier l'exécution correcte du programme.
Eh bien, ici, c'est assez simple.
Pour une explication, tournons-nous vers la douceur et la nouniness, et plus précisément vers le dossier "/ Photo / Seals /".
Nous aimons les chats et nous avons collecté beaucoup de photos.
La photo
Joints
Rousses
Rayé
Mouillé
Noir
Manula
Il arrive que nous lancions même directement un diaporama sur tout le dossier racine et l'admirions. Et donc, à un moment précis, lorsque vous avez presque atteint le nirvana, l'écran affiche:
Impossible d'afficher le fichier "/ Photo / Seals / Books / Puss in Boots.fb2"
Comme il s'est avéré plus tard, votre ami a décidé d'augmenter le degré de gentillesse et a hérité des «Sceaux» avec un nouveau sous-dossier du «Livre», ayant violé de manière flagrante le LSP, car la sous-classe «Livres» ne peut pas être utilisée à la place de la classe de base «Photo».
Conclusions:
- Le nom est effrayant, la définition est complexe, mais le principe lui-même est simple et intuitif.
- Si votre méthode s'attend à ce que «Photo» entre, alors peu importe l'héritier de «Photo» que vous lui glissez: «Manuli», «Redheads» ou «Wet», mais si «Books» vient à lui, alors il devait s'étouffer avec le thé.
I - Principe de ségrégation d'interface ou FAI
Les clients ne doivent pas dépendre de méthodes qu'ils n'utilisent pas.
Ici, il sera difficile d'expliquer avec des dossiers et des fichiers, mais j'essaierai - ne jugez pas strictement pour une certaine tension.
Vous en avez assez du lecteur de musique standard et vous avez décidé d'en télécharger un nouveau, tendance et hype. Il sait même afficher la couverture d'un album de musique et afficher les sous-titres d'une chanson jouée. Mais le problème est que si les fichiers «cover.jpg» et «subtitles.txt» ne se trouvent pas dans le dossier de l'album, le lecteur se bloque avec une erreur. Et maintenant, maudissant tout dans le monde, vous commencez à créer ces fichiers de raccord dans tous les sous-dossiers avec des albums.
Autrement dit, en tirant des analogies incorrectes, nous avons obligé la classe Music et tous ses héritiers à implémenter l'interface AudioCoverSubtitles. En même temps, cette interface n'implémente pleinement que l'album Waiting for the Sun, l'album The best of The Doors n'implémente que la partie Audio + Cover et le reste uniquement Audio.
Cela nous amène à l'idée qu'il est logique de diviser l'épaisse interface AudioCoverSubtitles en trois petits Audio, Cover et Sous-titres et de les utiliser uniquement là où ils sont vraiment nécessaires.
Conclusions:
- Le FAI concerne, tout à coup, la séparation des interfaces.
- Si votre interface vous oblige à créer des méthodes de stub, alors c'est une mauvaise interface et vous devriez la parcourir avec des ciseaux.
D - principe d'inversion de dépendance ou DIP
Les modules de niveau supérieur ne doivent pas dépendre de modules de niveau inférieur. Les deux types de modules doivent dépendre d'abstractions.
Les abstractions ne devraient pas dépendre des détails. Les détails doivent dépendre des abstractions.
Le module «Portes» ne doit pas dépendre du type de fichiers audio qu'il contient, .mp3, .flac ou .wav.
Le module Doors, son sous-module Waiting for the Sun (et tous les autres), dépend de l'abstraction de haut niveau de Music, qui détermine leur implémentation (le fait qu'ils contiennent de la musique).
Supposons que nous décidions de séparer le stockage de la musique selon le principe de la compression - «avec perte» et «sans perte». Ce sont les détails que la dépendance de l'abstraction «Musique» combine - en eux, en fin de compte, il doit toujours y avoir de la musique. De plus, l'abstraction «Musique» elle-même ne dépend pas de ces détails. Elle ne se soucie pas si la musique y est perdue ou sans eux - comme c'était de la musique, ça le reste.
Conclusions:
- DIP - c'est à ce sujet, le particulier devrait dépendre du général, et non vice versa.
- DIP est "Plus d'abstractions au dieu des abstractions!"
- Le DIP concerne aussi les causes et les effets, la bonne réponse à la question: «Les branches se balancent du fait que le vent souffle ou le vent souffle du fait que les branches se balancent»
Merci et bon week-end!