Quelle est l'importance des modèles de conception dans la programmation?

19

Je suis un étudiant universitaire et je viens de commencer à apprendre les modèles de conception et j'ai du mal à comprendre leur objectif. J'ai essayé de les rechercher, mais toutes les ressources que j'ai trouvées semblent en parler de manière académique et non professionnelle.

Quel est leur objectif et sont-ils importants à apprendre?

Roy James Schumacher
la source
7
Ils sont bons à savoir pour les entretiens d'embauche!
wim
5
Un modèle de conception n'est qu'un moyen nommé et récurrent de résoudre des problèmes. Ils résultent généralement de carences linguistiques.
Jon Purdy
7
Pour comprendre l'objectif des modèles de conception, il faut comprendre les problèmes qu'ils résolvent. Comprendre ces problèmes nécessite une expérience de la manière difficile :)
MattDavey

Réponses:

36

Les modèles de conception sont parfaits pour communiquer votre intention très rapidement - tout le monde sait ce qu'est une usine.

Ce qui est vraiment, vraiment, vraiment mauvais, c'est d'essayer d'adapter votre code à des modèles, ou de séparer les responsabilités en fonction des modèles, ou quelque chose comme ça. C'est une chose de dire "Cet objet est une usine" et une autre de dire "Cet objet devrait être exclusivement une usine".

DeadMG
la source
1
Vous êtes donc tous pour les modèles mais ils ne sont pas vraiment pour votre code. Oui, ils sont bons pour communiquer l'idée, mais ils sont encore meilleurs lorsque vous pouvez voir le modèle dans le code réel.
Newtopian
3
Pourquoi des votes négatifs? C'est en fait la meilleure réponse à mon humble avis. Le codage est du bon sens, et parfois vous pouvez rapidement utiliser des modèles qui conviennent bien pour résoudre le problème. Mais une fois que les gens commencent à en abuser partout, cela devient un enfer.
Coder
1
Chaque code contient un modèle, même si vous n'en avez pas connaissance. Les modèles de conception dont vous parlez ne font que regrouper et nommer un ensemble de modèles largement utilisés et utiles. Lorsque vous les connaissez, vous pouvez y penser de manière plus consciente. Si vous appelez l'une de vos classes "ControlDispenser", personne ne saura probablement ce qu'elle est censée faire. Cependant, si vous connaissez le modèle d'usine, vous l'appellerez "ControlFactory" et les autres comprendront immédiatement.
Olivier Jacot-Descombes
4
Si cela sert un autre objectif, ce devrait être une autre classe ... séparation des préoccupations.
Nate
2
@Nate: Un objectif peut être plusieurs modèles. Il n'y a aucune raison pour qu'une classe n'implique qu'un seul modèle. Les schémas ne sont pas des responsabilités "atomiques". Une seule responsabilité peut nécessiter plusieurs modèles.
DeadMG
26

De l'article de wikipedia sur modèles de conception :

L'utilité de parler de modèles est d'avoir une terminologie commune pour discuter des situations que les concepteurs voient déjà à plusieurs reprises.

Pendant très longtemps, nous avons eu un sérieux problème en génie logiciel: vous embauchez un nouveau venu dans un projet, et peu importe sa connaissance du langage de programmation, il leur faut des mois pour se mettre à jour avec la façon dont les choses se font dans votre projet avant qu'ils ne soient productifs. En génie matériel, ils ont résolu ce problème il y a très longtemps: ils ont une terminologie commune appelée «diagrammes schématiques». Vous embauchez un ingénieur matériel, leur donnez les schémas de votre projet matériel le matin, laissez-les les étudier et le soir avant qu'il soit temps de l'appeler un jour, ils peuvent prendre le pistolet à souder et devenir productifs. Nous avons essayé de trouver des moyens de nous améliorer dans ce domaine; la normalisation des langages de programmation était un moyen; les bibliothèques standard (bibliothèques de classes de nos jours) ont été une autre manière; mais l'un des moyens les plus importants a peut-être été les modèles de conception. Alors, sont-ils importants? Tu paries!

Mike Nakis
la source
3
Comparer le développement de logiciels à l'électrotechnique est à peu près aussi précis que comparer une fusée Saturne à un vélo. Les deux modes de transport (aller du point A au point B) mais allez-y de manière totalement différente et non compatible.
Jer
3
@jer Hmmm, votre analogie est mauvaise. Les deux sont des disciplines d'ingénierie. Même si leurs similitudes s'arrêtaient là, ils auraient, par définition, encore beaucoup de choses en commun. Nous n'espérons jamais les égaliser, mais l'un a beaucoup à apprendre de l'autre.
Mike Nakis
6
@Mike: il y a une différence fondamentale: les circuits électriques sont contraints par des limites physiques strictes. Les systèmes logiciels sont limités par les limites floues de l'intellect humain.
kevin cline
3
Tout d'abord, je n'ai pas dit qu'il n'y avait pas de grandes différences. Deuxièmement, votre déclaration n'est pas correcte non plus. Le logiciel obéit à des contraintes strictes, celles fixées par la syntaxe d'un langage. Et le nombre de permutations dans lesquelles l'intellect humain peut interconnecter des composants électroniques est également illimité. Mais encore une fois, je n'essaie pas d'assimiler les deux, ni même de dire qu'il y a énormément de similitudes. Je dis simplement que l' un a beaucoup à apprendre de l'autre .
Mike Nakis
3
Étant donné que le logiciel est une question de conception, une analogie similaire en génie électrique serait la discussion du «miroir de courant» et de la «rétroaction négative» dans un circuit amplificateur. Ce ne sont pas des composants discrets sur un schéma, mais plutôt une disposition de plusieurs composants qui remplit un certain objectif. Savoir connecter les composants sans connaître leur fonction ne permettra pas à une nouvelle personne de faire un nouveau design. (c.-à-d. c'est un pas en avant dans la compréhension.)
rwong
9

Il y a vraiment deux raisons différentes et substantielles à l'existence de modèles.

Le premier a déjà été assez bien expliqué: l'utilisation de modèles lubrifie la communication entre développeurs. Si vous et moi comprenons tous les deux que lorsque je dis «Observateur», je parle d'une structure de code très spécifique, je peux décrire très rapidement comment fonctionne un peu de code qui utilise ce modèle. L'alternative consiste à décrire complètement la solution, qui prend du temps et est sujette aux erreurs. ("Eh bien, j'ai créé cette classe virtuelle pure qui décrit et interface pour les objets de consommation, puis j'ai créé une classe qui maintient une liste de consommateurs actifs, qui ...")

Le deuxième avantage des modèles est qu'ils sont des formes de solution standard pour les formes de problème courantes. Si vous connaissez vos modèles et, par exemple, vous rencontrez un problème où vous devez trouver un bon moyen d'obtenir des informations à partir (éventuellement plusieurs) objets producteurs vers plusieurs objets consommateurs, sans introduire de couplage inutile entre les classes, vous reconnaîtrez "ce est un travail pour un observateur! " et vous saurez immédiatement comment résoudre votre problème.

Ces avantages se renforcent également vraiment. Ils vous permettent de résoudre rapidement certaines classes de problèmes courants, puis lorsque vous avez terminé, vous pouvez communiquer très rapidement comment vous avez résolu le problème.

Comparez cela à un monde où les modèles «n'existent pas». Vous rencontrez l'une de ces classes de problèmes, qui ne sont généralement pas des problèmes de conception triviaux, et vous passez pas mal de temps à trouver une bonne solution (qui, incidemment, ressemblera très probablement au modèle approprié). Ensuite, votre collègue arrive et veut savoir comment vous l'avez résolu, et vous passez une heure à discuter du comment et du pourquoi.

Tout cela est associé à une mise en garde qui devrait sembler assez évidente: n'essayez pas de forcer les problèmes dans des modèles qui ne correspondent pas. Si le motif ne correspond pas au problème, la solution finira par être compliquée et vous perdrez l'avantage de la réduction de l'effort des motifs. De plus, puisque votre travail ne correspondra plus à la compréhension de vos collègues de la signification du modèle, vous perdrez le coût de l'avantage de la communication. En fait, vous augmenterez probablement le coût de la communication au-delà du coût sans modèle, car une mauvaise utilisation du modèle donnera à vos collègues une fausse compréhension de la solution, ce qui est pire que pas de compréhension du tout.

ipeet
la source
2
C'est une idée fausse que les modèles de conception sont une solution standard. Ce sont des "MOTIFS" qui ne se traduisent pas toujours en code.
Martin York
Euh, un modèle se traduit toujours par du code, c'est à peu près une donnée - ce qui est un problème, c'est qu'ils ne correspondent pas toujours au code que vous avez, à l'architecture que vous avez ou aux contraintes sous lesquelles vous travaillez. c'est-à-dire simplement parce qu'un motif peut convenir, cela ne signifie pas nécessairement que vous pouvez l'utiliser. On pourrait supposer que c'est ce que vous vouliez dire (mais je n'aime pas faire d'hypothèses).
Murph
5

Les modèles concernent la réutilisation des idées et des concepts et l'établissement d'une plate-forme commune / cohérente pour leur communication.

Nous sommes tous d'accord (!) Qu'en théorie, la réutilisation de code est une bonne chose - mais cela s'avère plus difficile que nous ne le souhaiterions dans la pratique (à certains égards, cela change, mais ce sera toujours un défi ). Mais en réalité, une grande partie de ce que nous voulons réutiliser est une façon de faire, d'utiliser une sorte de modèle pour construire une solution à un problème particulier - ce sont des Patterns. Donc, vous arrivez à un cas où vous dites qu'une bonne approche pour résoudre le problème X est d'utiliser le modèle Y et nous savons que les éléments du modèle Y sont a, b et c et c'est parti. Parce que les schémas sont largement compris, vous n'avez pas à expliquer en profondeur quel est l'avantage de la communication.

Ce qui est amusant à propos des modèles, c'est que les langages et les frameworks évoluent pour fournir une meilleure prise en charge des modèles courants avec l'effet net que nous obtenons une réutilisation de code de plus en plus importante (des briques lego de plus en plus nombreuses!) Parce que la façon dont nous créons des applications (en implémentant des modèles ) facilite la réutilisation.

Murph
la source
4

Les modèles de conception ne sont que des briques connues sur lesquelles repose une solution logicielle. Ils sont importants pour les raisons suivantes:

  1. Ils sont indépendants de la langue. Une fois que vous savez quel modèle de conception est approprié pour un problème / une architecture / une tâche donné, vous pouvez l'implémenter dans n'importe quel langage multi-paradigme - que ce soit C #, Java ou Python - la solution sera dans la plupart des cas la même, vous n'avez plus qu'à pour adapter la syntaxe. Cela signifie que vous pouvez transférer votre expérience de la programmation dans une langue vers d'autres langues tant que vous restez dans le même domaine problématique (et peut-être même entre les domaines).

  2. Malgré le fait que les modèles de conception ont un lien avec le paradigme de programmation , ce qui signifie que les modèles de conception pour la programmation orientée objet (les plus célèbres, également appelés modèles «Gang of Four» ). Les modèles vous permettent de comprendre à quoi sert le paradigme et vous aident à dépasser la simple syntaxe.Par exemple, j'ai vu beaucoup d'implémentations en C # et Java où les gens ont juste programmé la façon dont ils l'ont fait dans Basic ou Fortran - ils ont un esprit impératif parfait pour résoudre les problèmes et ils utilisent la POO juste pour rendre cette solution - pas d'héritage , pas de polymorphisme, toutes les méthodes sont publiques, etc. Les modèles de conception vous aident à regarder derrière ces concepts et à voir comment ils fonctionnent dans la vie réelle. La même chose s'applique au modèle de conception dans d'autres paradigmes, comme la programmation fonctionnelle.

  3. Les modèles sont généralement un moyen pratique de représenter des idées et sont venus à l'informatique de l'architecture. Une fois que vous comprenez l'idée derrière un certain «modèle», vous pouvez facilement reconnaître ce modèle dans un autre problème et le résoudre en utilisant ce modèle (probablement légèrement modifié pour mieux répondre à votre problème). Il existe des tonnes de modèles différents: dans l' intégration de logiciels d'entreprise , dans les tests de code source, etc. Recherchez simplement les modèles dans les livres pour l'informatique.

  4. En plus d'acquérir de bonnes pratiques en apprenant des modèles, vous pouvez facilement apprendre à éviter les erreurs stupides dans votre code en étudiant les anti-modèles . Il existe de nombreux livres présentant des erreurs courantes dans différents domaines sous forme d'anti-modèles qui sont très divertissants et en même temps éducatifs. J'adore les noms de ces anti-motifs, au fait!

Alexander Galkin
la source
2

Vous pouvez considérer un modèle comme un moyen éprouvé de résoudre un problème que vous et les autres développeurs comprenez. Par exemple, le problème est de créer une liste triée de données, alors vous pouvez choisir d'utiliser une liste chaînée, ou mettre des données dans un vecteur et trier. Vous comprenez probablement ces deux options car vous connaissez peut-être déjà le modèle de liste liée ou le modèle de vecteur de chargement et de tri. Vous pouvez connaître les avantages et les inconvénients de chacun et n'avez pas besoin de voir la mise en œuvre pour comprendre ce qui se passe.

adam f
la source
1

Je pense que vous êtes un débutant pour la programmation, je ne vous suggère pas d'apprendre le modèle de conception tôt. L'apprentissage et la compréhension du modèle de conception doivent s'appuyer sur l'expérience du développement logiciel. Vous devriez être plus pratique pour coder et trouver quel style de code est mauvais, puis apprendre le modèle de conception pour améliorer la conception.

Mark xie
la source
1

L'utilité d'un modèle de conception dépend de la langue que vous choisissez. Plus vous choisissez un langage puissant, moins vous aurez besoin de comprendre et de mettre en œuvre des modèles de conception. Un modèle de conception peut être un signal que votre langue est nulle, il manque une fonction intégrée.

Joe Gregorio a fait un excellent discours sur le manque de modèles de conception en Python

Cesar Canassa
la source
Merci pour le lien sur le manque de modèles de conception en Python. Edit: Oups !! La vidéo a été supprimée de cet emplacement !! :(
Saurabh Patil
0

Les modèles de conception sont des solutions aux problèmes rencontrés fréquemment dans le développement de logiciels. Il existe toujours plus d'une solution à certains problèmes et les modèles de conception vous aident à décider quelle solution est la meilleure en vous fournissant un ensemble de bonnes solutions à ces problèmes courants.

Mansuro
la source