Tout le monde peut lire le livre du GoF pour savoir quels sont les modèles de conception et comment les utiliser, mais quel est le processus pour déterminer quand un modèle de conception résout un problème? La connaissance du motif guide-t-elle la conception ou existe-t-il un moyen de comprendre comment un motif peut être utilisé pour modifier une conception?
En d'autres termes, existe-t-il des modèles pour les modèles?
Les modèles de conception sont censés fournir une structure dans laquelle les problèmes peuvent être résolus. Lors de la résolution d'un problème réel, vous devez considérer beaucoup de minuscules variations d'une solution à ce problème pour voir si elle correspond à un modèle de conception. En particulier, vous devrez probablement généraliser votre problème, ou sa solution, pour adapter un modèle de conception.
La réponse est, c'est un art. Connaître les modèles de conception sont certainement une étape importante. Une façon de s'habituer à ce genre de choses est d'étudier applications les modèles de conception, pas seulement les modèles. Voir de nombreuses applications différentes d'un même modèle peut vous aider au fil du temps à mieux mapper une tâche sur un modèle.
Je recommande fortement de lire Head First Design Patterns de O'Reilly. Cela explique comment ces modèles peuvent être utilisés dans le monde réel.
J'ajouterais également que n'essayez pas trop de concevoir avec des motifs à l'esprit. De plus, recherchez les "odeurs de code" qu'un modèle pourrait aider à résoudre.
Il existe un concept de base sous-jacent à des modèles que la plupart des gens ne tiennent pas. Ne les considérez pas comme des structures de données ou des algorithmes.
Au lieu de cela, considérez votre code comme des personnes qui s'envoient des messages, comme passer des notes ou envoyer des lettres. Chaque objet est une "personne".
La façon dont vous organisez les "personnes" et les modèles qu'ils utilisent pour s'envoyer des messages sont les modèles.
Retournez la question: le motif que vous devriez faire est "quel motif correspond à mon problème". Considérez un modèle très simple, trouver un élément dans un tableau. en C, c'est quelque chose comme
TYPE_t ary[SIZE] = // ... gets initialized somehow
size_t ix ; // Your index variable
for(ix=0; ix < SIZE; ix++){
if (ary[ix] == item) {
return ix ;
}
}
Vous ne regardez pas le code et pensez "où puis-je utiliser cela", vous regardez le problème et vous dites "est-ce que je sais comment trouver un élément dans un tableau?"
Avec des modèles plus étendus, cela fonctionne vraiment de la même manière. Vous devez avoir de nombreuses copies d'une structure de données qui ne change pas souvent --- ce qui vous fait penser à "Flyweight". Vous voulez quelque chose qui vit des deux côtés d'une frontière de réseau, pensez-vous Proxy.
Lorsque vous étudiez des modèles, en particulier le GoF, demandez-vous "quelles situations appellent ce modèle? Ai-je déjà vu ce modèle? Pour quoi aurais-je pu l'utiliser dans des travaux précédents? Où puis-je trouver un exemple de cela dans ma propre vie? "
Modèles de conception? Vous les trempez!
Les modèles de conception n'ont rien de spécial, ce ne sont que des modèles de conception. Tout développement utilise des modèles de conception. Il existe un certain ensemble de modèles de conception dans la programmation orientée objet qui sont considérés comme généralement souhaitables et sont devenus les modèles de conception canoniques. Mais il existe également de nombreux modèles de conception indésirables ou autrement indifférents (tels que anti-modèles de conception ) ainsi que des modèles non découverts et/ou non documentés.
Vous ne pouvez pas éviter d'utiliser des modèles lors de la programmation. Mais vous pouvez devenir plus conscient des modèles que vous utilisez et du moment où certains modèles sont utiles et quand ils ne le sont pas. L'étude des modèles de conception canoniques à partir du livre du GoF aidera, tout comme l'apprentissage de odeurs de code et refactoring . Il n'y a pas de bonne réponse pour savoir quand un design ou un modèle de conception particulier doit être utilisé, vous devez acquérir une expérience dans leur utilisation et leur mise en œuvre afin de savoir quand et où utiliser quel modèle.
Expérience. Apprenez les modèles et les exemples réels de leurs utilisations. Chaque fois que vous avez une décision de conception à prendre, pensez à savoir si un motif que vous connaissez s’y appliquerait. Au fil du temps, vous vous améliorez et vous découvrez de nouvelles façons d'appliquer les modèles à un plus large éventail de problèmes.
Un autre grand livre que j'ai trouvé était:
Refactorisation des motifs
En montrant quand, où et comment vous pouvez modifier le code existant en modèles, cela m'a donné une bien meilleure compréhension des concepts et une capacité à identifier où ils peuvent être utilisés.
Rian van der Merwe a écrit un excellent article à ce sujet pour Smashing Magazine en juin 2012. Voici quelques points saillants.
Les modèles de conception sont utiles pour deux raisons:
van der Merwe recommande que nous envisagions de rompre les schémas lorsque:
Si vous connaissez les modèles, ils deviennent des outils dans votre boîte à outils. Lorsque vous regardez une tâche, vous sélectionnez parmi vos outils. À ce stade, vous devriez avoir une assez bonne idée de l'outil qui convient le mieux à un problème donné. C'est là que les formules cessent de fonctionner et que vous effectuez réellement des travaux d'ingénierie.
Comment avez-vous appris quand utiliser une instruction if?
Je le compare à cela parce que c'est une construction plus grande dont vous devez connaître les tenants et aboutissants avant de pouvoir l'utiliser efficacement. Une instruction if résout une classe de problèmes nécessitant une ramification. Un modèle de pont résout une classe de problèmes. Je ne les vois vraiment pas différemment.
Je suis d'accord qu'il ne suffit pas d'apprendre les schémas. Le problème avec la plupart des livres est qu'ils ne fournissent pas d'exemples concrets. J'ai entendu dire que les modèles de conception Head First, comme certains l'ont suggéré plus tôt, sont bons.
Une autre chose est que la plupart des livres ne sont pas intentionnellement spécifiques à la langue , ce qui peut être à la fois une bonne ou une mauvaise chose pour vous. Si important soit de comprendre un modèle en général, il est tout aussi important de bien le mettre en œuvre . Je suis tombé sur un livre intitulé C # 3.0 Design Patterns qui consacre à peu près la même quantité d'encre à ces deux aspects inséparables.
Le concept d'un modèle de conception a été emprunté à l'ingénierie structurelle, comme pour de nombreuses pratiques en génie logiciel. Si vous envisagez de construire une structure, il y a des décisions qui doivent être prises sur la façon de construire cette structure pour atteindre les objectifs fixés. Lors de la prise de ces décisions, vous devrez travailler sur un ensemble d'exigences. Cela peut être quelque chose d'aussi simple que Bridge doit être capable de supporter X tonnes à la fois, ou avoir une résistance à la traction particulière pour permettre suffisamment de mouvement dans le vent, etc. Un architecte utiliserait la connaissance préalable d'autres constructions pour faire ces choix de conception. Il/Elle aurait très peu de chances d'essayer de résoudre le problème à partir de zéro.
L'ingénierie logicielle et les modèles de conception sont exactement les mêmes. Ce sont simplement des solutions communes à des problèmes communs. Si vous connaissez les modèles de conception, lorsque vous travaillez sur une conception, et qu'une partie particulière d'un système nécessite quelque chose qui correspond à un modèle de conception que vous avez, utilisez-le. N'essayez pas d'adapter un système à un modèle de conception, adaptez les modèles de conception à votre système (où ils correspondent). Essayez simplement de les considérer comme un ensemble de solutions pour réduire la quantité de travail de conception que vous devez faire, et soyez prudent de trop concevoir vos solutions pour intégrer autant de modèles de conception que possible. Cela ne fera que rendre votre solution impossible à maintenir et probablement assez boguée.
J'ai eu cette même question lorsque j'ai rencontré pour la première fois des modèles de conception. J'ai apprécié les concepts, mais je ne savais pas quand ni comment les appliquer. Mon approche initiale était de rechercher l'applicabilité pendant la phase de conception. Une fois que vous avez un diagramme et des responsabilités semi-claires pour chaque bloc, il n'est pas trop difficile de prendre les responsabilités et de les renvoyer avec un livre de référence décent. Plusieurs bons ont été mentionnés ici, mais celui du GoF devrait être sur votre liste. L'étape suivante consiste à rechercher des améliorations dans la conception en fonction de ce que vous voyez dans les modèles.
Un modèle de conception est une description générique sur la façon de résoudre un ( problème commun . Il y a 2 choses auxquelles nous devons prêter attention:
Tout d'abord, il s'agit d'un Description générique ; ce n'est pas la solution concrète, et ce n'est pas une recette complète non plus, c'est juste une description de l'apparence de la solution afin d'aborder un problème commun.
Deuxièmement, le problème est que la question est un problème courant : , cela signifie que ce problème a été rencontré plusieurs fois auparavant, et plus les gens ont développé une description de la façon dont une solution idéale peut être appliquée à ce problème fréquemment répété.
Donc, si vous rencontrez un nouveau problème qui n'est pas courant, essayez de ne pas utiliser de modèles de conception pour le résoudre, ou du moins ne faites pas des modèles de conception votre outil pour résoudre tout type de problème auquel vous êtes confronté.