ça fait longtemps. C'est blanc. L'autre jour, les ingénieurs seniors ne connaissent pas le modèle de conception! ?? Après cela, j'ai reçu une "Introduction aux modèles de conception appris en langage Java" écrite par Hiroshi Yuki, alors j'ai décidé d'étudier. Cependant, même si j'ai lu le livre, je ne m'en souviens pas, alors j'ai décidé de l'écrire sous forme de mémorandum. Je ferai de mon mieux pour pouvoir terminer la course. De plus, il existe un exemple de programme dans "Introduction aux modèles de conception appris en langage Java", mais nous l'omettons pour des raisons de droits d'auteur. Essaye de comprendre.
La dernière fois, j'ai écrit un article sur le "modèle d'adaptateur". L'article précédent est ci-dessous. https://qiita.com/sirajirasajiki/items/0d58a3b9fe9bdb460d0d
Cette fois, je voudrais décrire le "modèle de méthode modèle". De plus, il existe un exemple de programme dans "Introduction aux modèles de conception appris en langage Java", mais nous l'omettons pour des raisons de droits d'auteur. Essaye de comprendre.
Connaissez-vous le genre des réincarnations de light novel? Fondamentalement, le genre de choses réincarnées a un flux fixe tel que le personnage principal mourant → obtenir une triche de Dieu → se réincarner dans un autre monde → faire un grand succès dans un autre monde. Quelque chose comme celui-ci qui peut être utilisé comme modèle s'appelle un modèle. Cependant, même si vous utilisez le modèle, la raison pour laquelle le personnage principal meurt, la triche reçue de Dieu, la vision du monde de la destination réincarnée, le contenu de l'activité en réincarnation, etc. différeront selon le roman. L'idée de base et le déroulement de l'histoire ne changent pas, mais la personne qui la fait réellement décide quoi faire dans chaque scène.
De cette manière, une méthode qui hérite de la classe qui détermine le cadre de traitement, crée une sous-classe et détermine le traitement réel dans la sous-classe est appelée "modèle de méthode de modèle".
Si vous créez un grand nombre de classes différentes qui traitent avec le même algorithme par copier-coller sans utiliser le "modèle de méthode modèle", ou si vous trouvez un bogue dans l'algorithme qui traite le même, copiez et collez Vous devez modifier toutes les classes que vous avez créées. En utilisant le "modèle de méthode modèle", vous pouvez modifier toutes les classes héritées en modifiant uniquement la superclasse.
À titre d'exemple concret, il y avait aussi «Introduction aux modèles de conception appris en langage Java»,
"Afficher des caractères et des chaînes 5 fois à plusieurs reprises"
Je voudrais penser en utilisant le contenu. Cependant, ajoutez des en-têtes et des pieds de page avant et après l'affichage des caractères et des chaînes. La méthode pour ajouter un en-tête est "open", la méthode pour ajouter un pied de page est "close", la méthode pour afficher les caractères et les chaînes de caractères est "print_string" et la méthode pour afficher des caractères et des chaînes de caractères à plusieurs reprises 5 fois est "display". ça ira. Dans la superclasse, on suppose que les trois méthodes "open", "close" et "print_string" sont des méthodes abstraites, et seul "display" est implémenté. On suppose que la méthode "display" implémentée dans la superclasse utilise trois méthodes, "open", "close" et "print_string".
À un moment donné, supposons que vous vouliez changer la partie qui "affiche les caractères et les chaînes de caractères 5 fois de manière répétée" pour "afficher les caractères et les chaînes de caractères 3 fois de manière répétée". Si vous créez plusieurs classes en copiant et en collant la partie traitement de la super classe sans hériter de la super classe, vous devez la modifier dans toutes les classes. Cependant, si vous avez créé une classe en héritant de la superclasse, vous pouvez facilement la modifier en ne changeant que la superclasse.
De cette façon, lors de la création de plusieurs processus du même algorithme, en utilisant le "modèle de méthode modèle", même si le processus de la partie commune change, il peut être facilement traité.
Comme mentionné dans "Introduction aux modèles de conception appris en langage Java",
Il est important de façonner le flux de processus au stade de la classe abstraite.
J'ai repensé à cela.
Les sous-classes créées à l'aide du "modèle de méthode modèle" utilisent les algorithmes définis dans la superclasse modèle tels quels. Par conséquent, il est nécessaire de créer une sous-classe après avoir compris ce que fait la superclasse.
Créez un diagramme de classes et du code Python à l'aide de l'exemple dans «Introduction aux modèles de conception appris dans le langage Java». La méthode pour ajouter un en-tête est "open", la méthode pour ajouter un pied de page est "close", la méthode pour afficher les caractères et les chaînes de caractères est "print_string" et la méthode pour afficher des caractères et des chaînes de caractères à plusieurs reprises 5 fois est "display". ça ira. Dans la superclasse, on suppose que les trois méthodes "open", "close" et "print_string" sont des méthodes abstraites, et seul "display" est implémenté. On suppose que la méthode "display" implémentée dans la superclasse utilise trois méthodes, "open", "close" et "print_string".
Ce diagramme de classes est décrit comme PlantUML. Le code PlantUML que j'ai écrit se trouve sur le GitHub ci-dessous, veuillez donc lire Lisez-moi avant de l'utiliser. template_method.txt. https://github.com/sirajirasajiki/design_pattern_uml/tree/master/template_method Pour plus de détails sur l'installation et l'utilisation de PlantUML, voir l'annexe ci-dessous.
Le code implémenté ci-dessous est disponible. Implémenté en Python 3.7. https://github.com/sirajirasajiki/design_pattern_python/tree/master/TemplateMethod
J'ai appris le "modèle de méthode modèle" qui définit le cadre de traitement dans la super classe et décrit le traitement spécifique dans la sous-classe.
En ajoutant un traitement spécifique au stade de la superclasse, il est possible de décider dans une certaine mesure comment le créer dans la sous-classe, donc même lorsqu'il est implémenté par quelqu'un d'autre que la personne qui a créé la superclasse, il peut être implémenté sans trop d'hésitation. Je me demandais. Plus tard, je n'ai pas pu penser à un exemple cette fois, alors je vais essayer d'en savoir plus.
~~ L'exemple utilisé dans l'explication sera implémenté en Python à une date ultérieure. ~~ Implémenté en Python.
S'il y a quelque chose qui ne va pas, je vous serais reconnaissant de bien vouloir le signaler!
appendix
https://qiita.com/sirajirasajiki/items/3a779d3529fbc14af801
Les sites suivants ont été pris en charge lors de l'installation de PlantUML. https://qiita.com/kohashi/items/1d2c6e859eeac72ed926 Les sites suivants ont été pris en compte lors de l'écriture de PlantUML. https://qiita.com/ogomr/items/0b5c4de7f38fd1482a48
Comment éviter les sauts de ligne dans la sortie standard en Python https://qiita.com/tortuepin/items/4fbf29e42f05cb4b02a5
08/03/2020 Ajout d'exemples, de diagrammes de classes et d'implémentation en Python
Recommended Posts