ç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 "Iterator pattern". L'article précédent est ci-dessous. https://qiita.com/sirajirasajiki/items/55269e5d6c6e158de16e
Cette fois, je voudrais décrire le "modèle d'adaptateur". 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.
Je pense qu'il y a des appareils électriques utilisés au Japon. Lors de l'utilisation de ce produit électrique à l'étranger, la tension est différente, donc je pense que je vais apporter un convertisseur pour la prise. De cette manière, lorsque l'élément déjà fourni ne peut pas être utilisé tel quel, il peut être utilisé en le convertissant en une forme utilisable. On dit qu'un tel modèle de conversion est appelé un modèle d'adaptateur. "Introduction aux modèles de conception appris en langage Java"
Modèle de conception pour combler la «différence» entre «ce qui est déjà fourni» et «ce dont vous avez besoin»
Il y avait une description disant. Ce modèle d'adaptateur est également appelé modèle Wrapper.
Il y avait une description dans «Introduction aux modèles de conception appris en langage Java», mais je pense qu'il y a une opinion que s'il y a une méthode nécessaire, vous pouvez la créer en plus. Cependant, si vous créez toutes les méthodes à partir de zéro, le temps et les efforts de test augmenteront considérablement.
Par exemple, supposons que vous ayez une méthode qui obtient unixtime et la renvoie comme un int, et que vous voulez une nouvelle méthode qui renvoie unixtime sous forme de chaîne. Dans un exemple aussi simple, transtyper la valeur de retour de la méthode en type chaîne est très bien, mais supposons que vous avez créé une nouvelle méthode qui renvoie l'heure sous forme de type chaîne. Si vous obtenez une erreur avec cette méthode nouvellement créée, vous ne pouvez pas dire uniquement à partir de la partie qui obtient l'heure, de la partie qui transite avec le type de chaîne ou de la partie que l'erreur s'est produite. ?? Cependant, si vous utilisez une méthode qui obtient un unixtime existant et le retourne sous forme de type int et crée une nouvelle méthode qui renvoie l'heure sous forme de chaîne et qu'une erreur se produit, la méthode existante est utilisée pour l'erreur dans la partie qui obtient l'heure. J'ai confirmé que ce n'est pas le cas, il est donc facile de voir que la conversion de int en chaîne échoue. De plus, lorsque vous créez une méthode, vous n'avez qu'à appeler la méthode existante, elle est donc facile à implémenter. De cette manière, en utilisant le modèle d'adaptateur, il est possible de raccourcir l'effort de montage et de réduire les causes d'erreurs qui se produisent pendant le montage.
Envisagez de modifier la valeur de retour d'une méthode qui obtient un unixtime existant et le renvoie en tant que type int afin qu'il soit converti en type chaîne. Comme mentionné dans "Introduction aux modèles de conception appris en langage Java", il est préférable d'utiliser le modèle d'adaptateur même dans ce cas. La raison en est qu'elle modifie l'implémentation existante, vous devez donc tester à nouveau la partie qui utilise cette méthode, donc même une petite modification demandera beaucoup d'efforts de test et sera gaspillée.
Il y avait une description dans «Introduction aux modèles de conception appris en langage Java», mais si les fonctions sont éloignées, il n'y a pas d'autre choix que de créer une nouvelle classe. L'image est la suivante.
Il est impossible de produire de l'eau du robinet à partir d'une source d'alimentation de 100 volts CA.
Il existe deux types de ce modèle d'adaptateur. -Modèle d'adaptateur par classe (en utilisant l'héritage) -Modèle d'adaptateur par instance (en utilisant le transfert) Je voudrais décrire chaque modèle pour l'exemple.
Nous allons créer un wrapper qui retourne un type de chaîne en utilisant une classe qui a une méthode qui obtient l'heure unix de l'heure à laquelle l'instance a été créée et la renvoie en tant que type int.
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. Le nom de fichier correspondant est class.txt. https://github.com/sirajirasajiki/design_pattern_uml/blob/master/adapter/class.txt
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/Adapter/class_case
La différence avec le modèle Adapter par classe est que GetTime est utilisé différemment dans GetTimeStr.
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. https://github.com/sirajirasajiki/design_pattern_uml/blob/master/adapter/instance.txt
Le code implémenté ci-dessous est disponible. Implémenté en Python 3.7. https://github.com/sirajirasajiki/design_pattern_python/tree/master/Adapter/instance_case
Il s'est avéré que le modèle Adapter est celui qui absorbe l'écart lorsque le format que vous souhaitez utiliser est différent de la classe existante.
En créant une nouvelle classe à l'aide d'une implémentation existante, le nombre d'étapes peut être réduit par rapport à la création d'une nouvelle, et si une erreur se produit dans la nouvelle implémentation, la gamme des causes de l'erreur peut être réduite, j'ai donc pensé que ce serait facile à implémenter. C'était. De plus, même une simple modification qui change le type de retour entraînera la refonte du test si la modification est apportée à l'implémentation existante, donc je comprends que ce modèle d'adaptateur doit être utilisé dans de tels cas. C'était.
Postscript J'ai entendu dire qu'il valait mieux faire un wrapper que de faire un adaptateur, donc à partir de maintenant, je dirai que je vais faire un wrapper.
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/53e1d2aea166190f9a6f
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
2020/2/28 Impressions et exemples partiellement mis à jour. 2020/3/5 La partie de début a été corrigée.
Recommended Posts