J'ai pris un cours à l'université qui a passé deux semaines autour de modèles de conception, et j'ai lu le livre Gang of Four en vain. Comprendre à quoi servait chaque modèle et comment les utiliser pour résoudre les problèmes mon était très difficile pour moi, un développeur qui n'avait pas beaucoup d'expérience en OO programmation.
Le livre qui l'a vraiment fait cliquer pour moi était Head First Design Patterns. Il commence par montrer un problème, différentes approches envisagées par les développeurs, puis comment ils ont fini par utiliser un modèle de conception pour le résoudre. Il utilise un langage très simple et maintient le livre très engageant.
Les modèles de conception finissent par être un moyen de décrire une solution, mais vous n'avez pas pour adapter vos classes à la solution. Considérez-les plutôt comme un guide qui suggère une bonne solution à un large éventail de problèmes.
Parlons de SOLID:
- Responsabilité unique . Une classe ne devrait avoir qu'une seule responsabilité. Cela signifie que, par exemple, une classe Person ne devrait se soucier que du problème de domaine concernant la personne elle-même, et non par exemple, de sa persistance dans la base de données. Pour cela, vous voudrez peut-être utiliser un PersonDAO par exemple. Une classe Personne peut vouloir conserver ses responsabilités le plus rapidement possible. Si une classe utilise trop de dépendances externes (c'est-à-dire d'autres classes), c'est un symptôme que la classe a trop de responsabilités. Ce problème survient souvent lorsque les développeurs tentent de modéliser le monde réel à l'aide d'objets et de le pousser trop loin. Les applications faiblement couplées ne sont souvent pas très faciles à naviguer et ne modélisent pas exactement le fonctionnement du monde réel.
- Ouvert Fermé . Les classes doivent être extensibles, mais non modifiables. Cela signifie que l'ajout d'un nouveau champ à une classe est correct, mais que les modifications des choses existantes ne le sont pas. D'autres composants du programme peuvent dépendre de ce champ.
- Substitution de Liskov . Une classe qui attend un objet de type animal devrait fonctionner si un chien de sous-classe et un chat de sous-classe sont passés. Cela signifie que Animal ne devrait PAS avoir une méthode appelée aboyer par exemple, car les sous-classes de type cat ne pourront pas aboyer. Les classes qui utilisent la classe Animal ne devraient pas non plus dépendre de méthodes appartenant à une classe Dog. Ne faites pas des choses comme "Si cet animal est un chien, alors (jette l'animal au chien) aboie. Si l'animal est un chat alors (jette l'animal au chat) miaou".
- Principe de ségrégation d'interface . Gardez vos interfaces les plus petites possible. Un enseignant qui est également un étudiant doit implémenter les interfaces IStudent et ITeacher, au lieu d'une seule grande interface appelée IStudentAndTeacher.
- Principe d'inversion de dépendance . Les objets ne doivent pas instancier leurs dépendances, mais ils doivent leur être transmis. Par exemple, une voiture qui a un objet Engine à l'intérieur ne doit pas faire engine = new DieselEngine (), mais plutôt ledit moteur doit lui être transmis par le constructeur. De cette façon, la classe de voiture ne sera pas couplée à la classe DieselEngine.