Ich habe schnell ein Programm geschrieben, um DI mit Python zu lernen

Hintergrund

Das Unternehmen sprach über DI (Dependency Injection), Ich wusste nicht, dass ich nicht gut genug war, also beschloss ich zu studieren

Was ist DI überhaupt?

・ Injektion von Abhängigkeit (wörtlich übersetzt) ・ Förderung der Komponentisierung durch Reduzierung des Kopplungsgrades ・ Effizienz des Unit-Tests ・ Reduzierte Abhängigkeit von einem bestimmten Rahmen ・ Es scheint einen DI-Container zu geben (hey)

Persönlich hat mich die Tatsache angezogen, dass Unit-Tests einfacher wurden.

Später, auch wenn es (anscheinend) zum Zeitpunkt der Implementierung komponiert wurde Es gibt nicht viel Verdienst, wenn sie voneinander abhängen.

(Es ist wirklich nutzlos zu glauben, dass man es nicht mit einem Muskel machen kann und wie viel man tun muss)

Ich werde es sofort schreiben

Wie auch immer, ich werde es schreiben.

Erstens ein Beispiel für Abhängigkeit.

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())

Ausführungsergebnis.


Japanese
SuperStar
Caesario!

Wenn du nicht weißt, was der Text ist, gehe zu youtube Suche nach "Japanese Superstar Sea Zario!"

Die GreatRealCondition-Klasse

・ Länderklasse ・ Positionsklasse ・ HorseName-Klasse

Es hat eine enge Beziehung zu diesen Klassen (** drei dichten **).

Man kann also sagen, dass diese Klassen unzusammenhängend aussehen und eigentlich fast eine Klasse sind.

Es kann nicht wiederverwendet werden und es kann überhaupt nicht getestet werden (Sie können den Wert oder irgendetwas im Moment nicht ändern). Sie können den Wert ändern, indem Sie einen Setter in die Country-Klasse usw. einfügen. Dies ist jedoch kein Test mehr für die GreatRealCondition-Klasse.

Versuchen Sie also, die Abhängigkeit zu verringern.

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())

Ausführungsergebnis.


Japanese
SuperStar
Caesario!

Das Ergebnis war das gleiche wie zuvor.

Die große Veränderung hier ist

** Die GreatRealCondition-Klasse hat keine anderen Klassen mehr **

Erschöpft.

Die GreatRealCondition-Klasse, die sich auf 3 dichte Klassen stützte und keine andere Verwendung hatte,

Durch 3 dichte Klassen im Konstruktor waren verschiedene Verwendungen möglich. (Eigentlich dachte ich, ich würde verschiedene Muster ausprobieren, aber diesmal wird es lange dauern)

Nun, ich habe den Konstruktor verwendet, um "Abhängigkeiten zu injizieren".

Auf den ersten Blick sieht es so aus.

von jetzt an

Diesmal habe ich mit dem Konstruktor injiziert,

Es scheint, dass es verschiedene Methoden wie Injektion mit Setter und Injektion durch Definieren der Schnittstelle gibt, also werde ich es auf jeden Fall versuchen.

Python kann auch ziemlich problematisch sein. (Ich bin einfach nicht daran gewöhnt)

Thanks!!

Hier ist ein hilfreicher Artikel. Vielen Dank. https://qiita.com/mkgask/items/d984f7f4d94cc39d8e3c

Recommended Posts

Ich habe schnell ein Programm geschrieben, um DI mit Python zu lernen
Ich habe ein Skript geschrieben, um mit AWS Lambda + Python 2.7 schnell eine Entwicklungsumgebung für Twitter Bot zu erstellen
Ich möchte ein Spiel mit Python machen
Ich möchte mit Python in eine Datei schreiben
Ich habe versucht, ein Programm zu erstellen, das Hexadezimalzahlen mit Python in Dezimalzahlen konvertiert
Ich möchte schnell UUID generieren (Gedenknotiz) ~ Python Edition ~
Ich möchte mit einem Roboter in Python arbeiten.
Vom Kauf eines Computers bis zur Ausführung eines Programms auf Python
Ich möchte einen Quantencomputer mit Python betreiben
Ich habe ein Paket erstellt, um Zeitreihen mit Python zu filtern
Ich habe ein Programm erstellt, um Bilder mit Python und OpenCV in ASCII-Grafik umzuwandeln
Ich habe mit Python eine Lotterie gemacht.
Ich möchte mit Python debuggen
Ich habe mit Python einen Daemon erstellt
Ich schrieb einen Test in "Ich habe versucht, die Wahrscheinlichkeit eines Bingospiels mit Python zu simulieren".
Starten eines mit Jupyter Notebook erstellten Python-Programms
Ich habe eine Bibliothek erstellt, die Konfigurationsdateien mit Python einfach lesen kann
[3.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
[Python] Ein Memo, das ich versucht habe, mit Asyncio zu beginnen
Ich habe ein Skript geschrieben, mit dem Sie mit hoher Geschwindigkeit mit AtCoder beginnen können!
Ich habe versucht, mit Python eine Liste von Primzahlen zu erstellen
Ich möchte den vollständigen Text mit elasticsearch + python durchsuchen
Ich habe eine Funktion zum Laden des Git-Erweiterungsskripts in Python geschrieben
Ich habe versucht, mit Selenium und Python einen regelmäßigen Ausführungsprozess durchzuführen
Ich habe versucht, mit Python eine 2-Kanal-Post-Benachrichtigungsanwendung zu erstellen
Ich wollte das ABC164 A ~ D-Problem mit Python lösen
[Einführung] Ich möchte mit Python einen Mastodon-Bot erstellen! 【Anfänger】
Ich habe ein Skript geschrieben, um Webseiten-Links in Python zu extrahieren
Ich habe versucht, Bulls and Cows mit einem Shell-Programm zu erstellen
Ich habe versucht, eine ToDo-App mit einer Flasche mit Python zu erstellen
[4.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
[1.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
[Python] Ein Programm, das Treppen mit # erstellt
Ich habe ein Pay-Management-Programm in Python erstellt!
Ich habe mit Python einen Zeichenzähler erstellt
Ich habe Python 3.5.1 installiert, um maschinelles Lernen zu studieren
Ich habe eine Heatmap mit Seaborn [Python] gezeichnet.
Ich wollte ABC160 mit Python lösen
Ich möchte eine Python-Umgebung erstellen
Ich möchte Protokolle mit Python analysieren
Ich möchte mit aws mit Python spielen
Ich habe eine funktionale Sprache mit Python ausprobiert
Was ich mit Python-Arrays gemacht habe
Ich habe mit Python eine Hex-Map erstellt
Ich habe mit Python ein schurkenhaftes Spiel gemacht
Ich wollte ABC172 mit Python lösen
Ich habe mit Python einen einfachen Blackjack gemacht
Ich habe mit Python eine Einstellungsdatei erstellt
Ich habe mit Python einen Neuronensimulator erstellt
FBX SDK Welche Fähigkeiten benötige ich, um ein Programm mit Python zu erstellen?
Ich habe versucht, mit einem Remote-Server über Socket-Kommunikation mit Python zu kommunizieren.
Ich habe ein Tool zum automatischen Durchsuchen mehrerer Websites mit Selenium (Python) erstellt.
Ich war süchtig danach, eine Python-Venv-Umgebung mit VS Code zu erstellen
Ich habe versucht, mit Raspeye 4 (Python Edition) ein signalähnliches Signal zu erzeugen.
Ich erhalte einen UnicodeDecodeError, wenn ich versuche, mit Python sqlalchemy eine Verbindung zu Oracle herzustellen