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
・ 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)
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.
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