Choisir le bon modèle de conception

32

J'ai toujours reconnu l'importance d'utiliser des modèles de conception. Je suis curieux de savoir comment les autres développeurs choisissent le plus approprié. Utilisez-vous une série de caractéristiques (comme un organigramme) pour vous aider à décider?

Par exemple:

Si les objets sont liés, mais que nous ne voulons pas spécifier de classe concrète, considérons Résumé

Lorsque l'instanciation est laissée aux classes dérivées, considérez Factory

Besoin d'accéder séquentiellement aux éléments d'un objet agrégé, essayez Iterator

ou quelque chose de similaire?

Carl Sagan
la source
8
Quelle est, selon vous, l'importance? programmers.stackexchange.com/questions/70877/…
pdr
Je pense que l'importance est dans la capacité de reconnaître le modèle le plus approprié et le plus holistique, pour être en mesure de le communiquer finalement à d'autres développeurs. Si ça a du sens?
Carl Sagan
Je suis d'accord avec @pdr. Je pense à ce que je dois faire et me souvenir du nom du modèle m'aide à nommer la classe pour que les autres sachent aussi ce qu'elle fait.
Amy Blankenship
4
Effectivement. Cela pourrait simplement se résumer à "Comment choisissez-vous le bon design?". Tout d'abord, il n'y a pas de bon design, juste plein de mauvais. Au-delà de cela, il vient avec une expérience de piles (choisir les mauvais).
Telastyn

Réponses:

109

Une idée fausse clé dans le monde du codage actuel est que les modèles sont des blocs de construction. Vous prenez un AbstractFactoryici et un Flyweightlà-bas et peut-être un Singletonlà-bas et vous les connectez avec XML et presto, vous avez une application qui fonctionne.

Ils ne sont pas.

Hmm, ce n'était pas assez gros.

Les motifs ne sont pas des blocs de construction

C'est mieux.

Un modèle est quelque chose que vous utilisez lorsque vous constatez que vous avez un problème - vous avez besoin d'une certaine flexibilité que le modèle fournit, ou que vous êtes tombé sur lorsque vous créez un petit langage dans le fichier de configuration et que vous dites «attendez un instant, arrêtez, c'est son propre interprète que j'écris - c'est un problème connu et résolu, utilisez un modèle d'interprète . "

Mais notez que c'est quelque chose que vous découvrez dans votre code, pas quelque chose avec lequel vous commencez. Les créateurs de Java n'ont pas dit "Oh, nous allons mettre un Flyweight dans l'entier" au début, mais ont plutôt réalisé un problème de performance qui pourrait être résolu par un flyweight .

Et donc, il n'y a pas de "diagramme de flux" que vous utilisez pour trouver le bon modèle. Le modèle est une solution à un type spécifique de problème qui a été rencontré à maintes reprises et dont les éléments clés sont distillés dans un modèle.

Commencer avec le Pattern, c'est comme avoir une solution et chercher un problème. C'est une mauvaise chose: cela conduit à une ingénierie excessive et finalement à une rigidité dans la conception.

Lorsque vous écrivez du code, lorsque vous réalisez que vous écrivez une usine, vous pouvez dire "ah ha! C'est une usine que je suis sur le point d'écrire" et utilisez votre connaissance du modèle d'usine pour écrire rapidement le prochain morceau de sans essayer de redécouvrir le modèle Factory. Mais vous ne commencez pas par "J'ai une classe ici, j'écrirai une usine pour qu'elle soit flexible" - parce que non.

Voici un extrait d'une interview avec Erich Gamma (de Gamma, Helm, Johnson et Vissides ): Comment utiliser les modèles de conception :

Essayer d'utiliser tous les motifs est une mauvaise chose, car vous vous retrouverez avec des conceptions synthétiques - des conceptions spéculatives qui ont une flexibilité dont personne n'a besoin. De nos jours, le logiciel est trop complexe. Nous ne pouvons pas nous permettre de spéculer sur ce qu'il devrait faire d'autre. Nous devons vraiment nous concentrer sur ce dont il a besoin. C'est pourquoi j'aime refactoriser les modèles. Les gens devraient apprendre que lorsqu'ils ont un type particulier de problème ou d'odeur de code, comme les gens l'appellent de nos jours, ils peuvent aller dans leur boîte à outils de modèles pour trouver une solution.


La meilleure aide pour le "quoi utiliser, quand" est probablement la page Wikipedia pour le modèle de conception de logiciels - la section "Classification et liste" décrit la catégorie dans laquelle chaque modèle se trouve et ce qu'il fait. Il n'y a pas d'organigramme; la description, il y a probablement le meilleur que vous trouverez comme un court extrait pour "quoi utiliser, quand."

Notez que vous trouverez différents modèles dans différents domaines de programmation. La conception Web a son propre ensemble de modèles tandis que JEE (pas la conception Web) a un autre ensemble de modèles. Les modèles de programmation financière sont complètement différents de ceux de la conception d'interface utilisateur d'application autonome.

Ainsi , toute tentative de les énumérer tous est par nature incomplète. Vous en trouvez un, découvrez comment l'utiliser, puis il devient finalement une seconde nature et vous n'avez plus besoin de penser à comment ou quand l'utiliser à nouveau (jusqu'à ce que quelqu'un vous demande de l'expliquer).

Robert Harvey
la source
11
+1 pour "solution à la recherche d'un problème". Connaître les modèles vous permettra d'ignorer leur découverte naturelle quand il s'avère que vous devez résoudre un problème qu'ils arrivent à résoudre. Les connaître vous aidera probablement à améliorer vos compétences de codage et de conception, de la même manière que la lecture du code d'autres personnes ou l'apprentissage d'un autre langage de programmation. Mais vous ne devriez certainement pas essayer activement d '«adapter les modèles» à votre code.
gregmac
1
Je recommande toujours aux développeurs de commencer à examiner les modèles pour se familiariser d'abord avec les principes de conception. Chaque modèle est une illustration de certains des principes de conception (l'ensemble de principes «SOLIDE» n'est qu'un exemple).
ryscl
2
Peut-être que vous ajoutez un décorateur et une façade, vous auriez une application ;-) Dit d'une autre manière, l'intérêt des modèles de conception est de nous donner un nom, un langage commun lorsque nous discutons de ce que nous construisons. C'est un raccourci pour une pile de connaissances en développement durement acquises.
EBarr
2
En lisant entre les lignes ici, les étapes pour choisir un modèle de conception: 1. Pensez toujours de façon critique à tout code dans lequel vous travaillez. 2. Abstenez le code spécifique dans un problème de base 3. Ce problème a-t-il une solution connue (modèle de conception )? 4. Oui, comment appliquer cette solution à mes spécificités? 5. Adaptez la solution générique au problème abstrait, pour créer une solution à votre problème spécifique.
Chris
@Chris qui résume vraiment. Il n'y a rien de mal non plus à l'écrire sans modèles puis à refactoriser le code dans le modèle approprié si la conception en a besoin.
18

Je me demande:

  1. Quel problème essaie-je de résoudre?
  2. Quel modèle de conception de logiciel (le cas échéant) résout le plus étroitement le même problème ou fournit un chemin logique vers la résolution de mon problème?
  3. Ai-je besoin de l'abstraction (et de la complexité) supplémentaire fournie par le modèle, ou s'agit-il d'une ingénierie excessive pour mon problème particulier? Le problème peut-il être résolu de manière plus simple et plus efficace sans modèle?

Le processus de choix d'un modèle logiciel n'est pas différent du processus de choix d'une structure de données, sauf qu'en choisissant une structure de données, vous évalueriez les performances et les caractéristiques de la mémoire de votre problème, et choisiriez la structure de données qui correspond le mieux à ces caractéristiques.

Robert Harvey
la source
Bien sûr, c'est une question d'expérience et d'expert, au lieu d'un plan ou d'un organigramme, et je suis d'accord avec vous. Mais il doit y avoir certains utiliser des ressources complètes comme une feuille de triche avancée dans laquelle il a été classé, au moins dans le cas avec les modèles les plus importants et les plus fréquents comme l'usine, etc. Je suis comme une situation recommandée parmi que vous feriez mieux d'utiliser un modèle. Connaissez-vous une telle ressource sur Internet?!
Pmpr
3
@Trix: sourcemaking.com/design_patterns
Robert Harvey