J'ai écrit rapidement un programme pour étudier la DI avec Python ①

Contexte

La société a parlé de DI (Dependency Injection), Je ne savais pas que je n'étais pas assez bon, alors j'ai décidé d'étudier

Qu'est-ce que DI en premier lieu?

・ Injection de dépendance (traduit littéralement) ・ Promotion de la mise en composants en réduisant le degré de couplage ・ Efficacité du test unitaire ・ Dépendance réduite à un cadre spécifique ・ Il semble y avoir un conteneur DI (hé)

Personnellement, j'ai été attiré par le fait que les tests unitaires sont devenus plus faciles.

Plus tard, même s'il était (apparemment) composant au moment de la mise en œuvre Il n'y a pas beaucoup de mérite s'ils dépendent les uns des autres.

(C'est vraiment inutile de penser que ce n'est pas bien si c'est droit, et à quel point c'est bon)

Je l'écrirai immédiatement

Bref, je vais l'écrire.

Tout d'abord, un exemple de dépendance.

no_di.py


class Country:
    def getCountry(self):
        return "Japanese"


class Position:
    def getPosition(self):
        return 'SuperStar'


class HorseName:
    def getName(self):
        return 'Caesario'


class GreatRealCondition:
    def __init__(self):
        self.c = Country()
        self.p = Position()
        self.h = HorseName()

    def getGreatRealCondition(self):
        return self.c.getCountry() + "\n" + self.p.getPosition() + "\n" + self.h.getName() + "!"


if __name__ == '__main__':
    g = GreatRealCondition()
    print(g.getGreatRealCondition())

Résultat d'exécution.


Japanese
SuperStar
Caesario!

Si vous ne savez pas quel est le texte, allez sur youtube Recherchez "Japanese Superstar Sea Zario!"

La classe GreatRealCondition

・ Classe de pays ・ Classe de position ・ Classe HorseName

Il a une relation étroite avec ces classes (** trois denses **).

On peut donc dire que ces classes semblent disjointes et sont en fait presque une classe.

Il ne peut pas être réutilisé, et il ne peut pas être testé en premier lieu (vous ne pouvez pas changer la valeur ou quoi que ce soit pour le moment). Vous pouvez changer la valeur en mettant un setter dans la classe Country, etc., mais ce n'est plus un test de la classe GreatRealCondition.

Alors, essayez de réduire la dépendance.

on_di.py


class Country:
    def getCountry(self):
        return "Japanese"


class Position:
    def getPosition(self):
        return 'SuperStar'


class HorseName:
    def getName(self):
        return 'Caesario'


class GreatRealCondition:
    def __init__(self, c: Country, p: Position, h: HorseName):
        self.c = c
        self.p = p
        self.h = h

    def getGreatRealCondition(self):
        return self.c.getCountry() + "\n" + self.p.getPosition() + "\n" + self.h.getName() + "!"


if __name__ == '__main__':
    c = Country()
    p = Position()
    h = HorseName()
    g = GreatRealCondition(c, p, h)
    print(g.getGreatRealCondition())

Résultat d'exécution.


Japanese
SuperStar
Caesario!

Le résultat était le même qu'avant.

Le grand changement ici est

** La classe GreatRealCondition n'a plus d'autres classes **

Épuisé.

La classe GreatRealCondition, qui reposait sur 3 classes denses et n'avait aucune autre utilité,

En ayant 3 classes denses dans le constructeur, diverses utilisations étaient possibles. (En fait, je pensais essayer différents modèles, mais ça va être long, donc cette fois)

Eh bien, j'ai utilisé le constructeur pour "injecter des dépendances".

Au début, ça ressemble à ça.

à partir de maintenant

Cette fois, j'ai injecté en utilisant le constructeur,

Il semble qu'il existe différentes méthodes telles que l'injection avec setter et l'injection en définissant l'interface, donc je vais certainement l'essayer.

De plus, python peut être assez gênant pour la DI. (Je ne suis tout simplement pas habitué)

Thanks!!

Voici un article utile. Merci beaucoup. https://qiita.com/mkgask/items/d984f7f4d94cc39d8e3c

Recommended Posts

J'ai écrit rapidement un programme pour étudier la DI avec Python ①
J'ai écrit un script pour créer rapidement un environnement de développement pour Twitter Bot avec AWS Lambda + Python 2.7
Je veux faire un jeu avec Python
Je veux écrire dans un fichier avec Python
J'ai essayé de créer un programme qui convertit les nombres hexadécimaux en nombres décimaux avec python
Je veux générer rapidement UUID (memo memo) ~ Edition Python ~
Je veux travailler avec un robot en python.
De l'achat d'un ordinateur à l'exécution d'un programme sur python
Je veux faire fonctionner un ordinateur quantique avec Python
J'ai créé un package pour filtrer les séries chronologiques avec python
J'ai créé un programme pour convertir des images en art ASCII avec Python et OpenCV
J'ai fait une loterie avec Python.
Je veux déboguer avec Python
J'ai créé un démon avec Python
J'ai écrit un doctest dans "J'ai essayé de simuler la probabilité d'un jeu de bingo avec Python"
Comment démarrer par lots un programme Python créé avec le notebook Jupyter
J'ai créé une bibliothèque qui lit facilement les fichiers de configuration avec Python
[3ème] J'ai essayé de créer un certain outil de type Authenticator avec python
[Python] Un mémo que j'ai essayé de démarrer avec asyncio
J'ai écrit un script pour vous aider à démarrer avec AtCoder à grande vitesse!
J'ai essayé de créer une liste de nombres premiers avec python
Je souhaite rechercher le texte intégral avec elasticsearch + python
J'ai écrit une fonction pour charger le script d'extension Git en Python
J'ai essayé de faire un processus d'exécution périodique avec Selenium et Python
J'ai essayé de créer une application de notification de publication à 2 canaux avec Python
Je voulais résoudre le problème ABC164 A ~ D avec Python
[Introduction] Je veux créer un robot Mastodon avec Python! 【Débutants】
J'ai écrit un script pour extraire les liens de pages Web en Python
J'ai essayé de créer des taureaux et des vaches avec un programme shell
J'ai essayé de créer une application todo en utilisant une bouteille avec python
[4th] J'ai essayé de créer un certain outil de type Authenticator avec python
[1er] J'ai essayé de créer un certain outil de type Authenticator avec python
[Python] Un programme qui crée des escaliers avec #
J'ai fait un programme de gestion de la paie en Python!
J'ai fait un compteur de caractères avec Python
J'ai installé Python 3.5.1 pour étudier l'apprentissage automatique
J'ai dessiné une carte thermique avec Seaborn [Python]
Je voulais résoudre ABC160 avec Python
Je veux créer un environnement Python
Je veux analyser les journaux avec Python
Je veux jouer avec aws avec python
J'ai essayé un langage fonctionnel avec Python
Ce que j'ai fait avec les tableaux Python
J'ai fait une carte hexadécimale avec Python
J'ai fait un jeu rogue-like avec Python
Je voulais résoudre ABC172 avec Python
J'ai fait un simple blackjack avec Python
J'ai créé un fichier de configuration avec Python
J'ai fait un simulateur de neurones avec Python
FBX SDK De quelles compétences ai-je besoin pour créer un programme à l'aide de Python?
J'ai essayé de communiquer avec un serveur distant par communication Socket avec Python.
J'ai créé un outil pour parcourir automatiquement plusieurs sites avec Selenium (Python)
J'étais accro à la création d'un environnement Python venv avec VS Code
J'ai essayé de faire un signal avec Raspeye 4 (édition Python)
J'obtiens un UnicodeDecodeError en essayant de me connecter à oracle avec python sqlalchemy