[PYTHON] Résumé du chapitre 2 de l'introduction aux modèles de conception appris en langage Java

ç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.

Chapitre 2 Cache-adaptateur et réutilisation

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.

Pourquoi avez-vous besoin d'un tel modèle?

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.

Type de modèle d'adaptateur

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.

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.

Modèle d'adaptateur par classe

Diagramme de classe

class.png

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.

Implémenté en Python sur la base du diagramme de classes

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

Modèle d'adaptateur par instance

Diagramme de classe

La différence avec le modèle Adapter par classe est que GetTime est utilisé différemment dans GetTimeStr. instance.png

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

Implémenté en Python sur la base du diagramme de classes

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

Résumé

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.

Chapitre 2 Impressions

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.

finalement

S'il y a quelque chose qui ne va pas, je vous serais reconnaissant de bien vouloir le signaler! appendix

Article suivant

https://qiita.com/sirajirasajiki/items/53e1d2aea166190f9a6f

Site sur PlantUML

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

Journal des modifications

2020/2/28 Impressions et exemples partiellement mis à jour. 2020/3/5 La partie de début a été corrigée.

Recommended Posts

Résumé du chapitre 2 de l'introduction aux modèles de conception appris en langage Java
Chapitre 4 Résumé de l'introduction aux modèles de conception appris en langage Java
Résumé du chapitre 3 de l'introduction aux modèles de conception appris en langage Java
Résumé du début au chapitre 1 de l'introduction aux modèles de conception appris en langage Java
Résumé des modèles de prototypes d'introduction aux modèles de conception appris en langage Java
Résumé des modèles singleton de l'introduction aux modèles de conception appris en langage Java
[Mis à jour de temps en temps] Résumé des modèles de conception en Java
Modèles de conception appris avec Java et PHP (résumé)
[Chapitre 5] Introduction à Python avec 100 coups de traitement du langage
[Chapitre 6] Introduction à scicit-learn avec 100 coups de traitement du langage
[Chapitre 3] Introduction à Python avec 100 coups de traitement du langage
Modèles de conception en Python: introduction
[Chapitre 2] Introduction à Python avec 100 coups de traitement du langage
[Chapitre 4] Introduction à Python avec 100 coups de traitement du langage
Introduction à l'API Socket apprise en langage C, partie 1, édition serveur
Introduction à la vérification de l'efficacité Chapitre 1 écrit en Python
Introduction à la vérification de l'efficacité Chapitre 3 écrit en Python
100 Commandes de traitement du langage Knock UNIX apprises au chapitre 2
Résumé de la façon d'importer des fichiers dans Python 3
100 Traitement du langage Knock Expressions régulières apprises au chapitre 3
Résumé de l'utilisation de MNIST avec Python
100 traitements du langage frappent l'analyse morphologique apprise au chapitre 4
Introduction à la vérification de l'efficacité Chapitre 2 écrit en Python
Comprendre les modèles de conception en comparant les implémentations en JavaScript et Java [mis à jour de temps en temps]
Résumé des outils nécessaires pour analyser les données en Python
Introduction au langage Python
[Introduction à Python] Résumé des fonctions et méthodes qui apparaissent fréquemment en Python [Format du problème]
Modèles de conception à utiliser avec les bibliothèques Java fréquemment utilisées - Modèle de constructeur
Modèles de conception à utiliser avec les bibliothèques Java fréquemment utilisées - Modèles d'adaptateur
Modèles de conception à utiliser avec les bibliothèques Java fréquemment utilisées - Modèles de stratégie
Introduction aux statistiques Exercices du chapitre 2 de la presse de l'Université de Tokyo
Résumé de l'écriture des fichiers .proto utilisés dans gRPC
Introduction à l'API Socket apprise en langage C 2e édition client
[Introduction à cx_Oracle] Présentation de cx_Oracle
Essayons le livre "Introduction au développement d'applications de traitement du langage naturel en 15 étapes" --Chapitre 3 Étape 10 Mémo "Détails et amélioration du réseau neuronal"
Essayez le livre «Introduction au développement d'applications de traitement du langage naturel en 15 étapes» - Chapitre 2 Étape 06 Mémo «Identifiant»
Essayez le livre "Introduction au développement d'applications de traitement du langage naturel en 15 étapes" - Chapitre 2 Étape 02 Mémo "Prétraitement"
Essayez le livre «Introduction au développement d'applications de traitement du langage naturel en 15 étapes» - Chapitre 2 Étape 07 Mémo «Évaluation»
Introduction à l'API Socket apprise en langage C 3e serveur / client TCP # 1
Comment implémenter du code Java en arrière-plan de Red Hat (Linux ONE)
[Python] PCA scratch dans l'exemple de "Introduction à la méthode d'analyse multivariée"
Modèles de conception à utiliser avec les bibliothèques Java fréquemment utilisées - Modèle de méthode de modèle
J'ai essayé de faire 5 modèles de base d'analyse en 3 ans
Modèles de conception à utiliser avec les bibliothèques Java fréquemment utilisées - Modèle de façade
Introduction à l'API Socket apprise en langage C 4e édition serveur / client UDP # 1
Essayez le livre "Introduction au développement d'applications de traitement du langage naturel en 15 étapes" --Chapitre 4 Etape 14 Mémo "Recherche Hyper Paramètre"
Résumé de la façon d'écrire des instructions if (Scala, Java, Rust, langage C, C ++, langage Go, PHP, Perl, Python, Ruby)
Essayez le livre «Introduction au développement d'applications de traitement du langage naturel en 15 étapes» --Chapitre 2 Étape 04 Mémo «Extraction de fonctionnalités»
Essayez le livre "Introduction au développement d'applications de traitement du langage naturel en 15 étapes" - Chapitre 4 Étape 15 Mémo "Collecte de données"
Essayez le livre «Introduction au développement d'applications de traitement du langage naturel en 15 étapes» - Chapitre 3 Étape 08 Mémo «Introduction aux réseaux de neurones»
Essayez le livre "Introduction au développement d'applications de traitement du langage naturel en 15 étapes" --Chapitre 2 Étape 05 Mémo "Conversion de quantité de fonctionnalités"
Essayez le livre "Introduction au développement d'applications de traitement du langage naturel en 15 étapes" - Chapitre 3 Étape 11 Mémo "Embeddings de mots"
Explication facile à comprendre de l'application Web Python (Django) même pour les débutants (4) [Route setting / Introduction to MTV design patterns]
Résumé de l'utilisation de pandas.DataFrame.loc
100 Language Processing Knock Chapitre 1 en Python
[Introduction à Python3 Jour 13] Chapitre 7 Chaînes de caractères (7.1-7.1.1.1)
Résumé de l'utilisation de pyenv-virtualenv
[Introduction à Python3 Jour 14] Chapitre 7 Chaînes de caractères (7.1.1.1 à 7.1.1.4)
Introduction à Protobuf-c (langage C ⇔ Python)
Introduction d'une méthode de conception de contrôleur pilotée par les données
Résumé des différentes opérations dans Tensorflow