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 aux éléments d'un objet agrégé de manière séquentielle, essayez Iterator
ou quelque chose de similaire?
Une idée fausse clé dans le monde du codage actuel est que les modèles sont des blocs de construction. Vous prenez un AbstractFactory
ici et un Flyweight
là et peut-être un Singleton
là-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.
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 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 poids mouche .
Et donc, il n'y a aucun "organigramme" 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 ce ne sera pas le cas.
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 modèle de conception de logiciel - 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.
Donc, toute tentative de les répertorier tous est intrinsèquement 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).
Je me demande:
Le processus de choix d'un modèle de 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 caractéristiques de la mémoire de votre problème, et choisissez la structure de données qui correspond le mieux à ces caractéristiques.