Edited at

DIについて調べてみたら理解仕掛けたのでpythonでまとめてみる

月曜日の夜なのに眠れないのでDIについて調べみた


DI(Dependency Injection)とは


  • 依存性の注入とか呼ばれるもの

  • あるクラスAの成立に他のクラスBが必要なときAはBに依存している

  • インターフェースを定義して、外部から依存先を注入できるようにしたもの


依存性を外部から注入出来ていない例


  • Watcherは自分自身の心の中で視聴するアニメを決めてしまっているので他にアニメがあっても一個しかアニメを観れない


class SSSSGridman():

def bloadcast(self):
return "gridman !!!"

class Jojo():

def bloadcast(self):
return "yareyaredaze !!!"

class Watcher():

def in_my_heart(self):
self.jojo = SSSSGridman()

def watch(self):
print("I watchd", self.jojo.bloadcast())

if __name__ == "__main__":
watcher = Watcher()
watcher.in_my_heart()
watcher.watch()

# 実行結果

I watchd gridman !!!


依存性を外部から注入出来ている例


  • アニメという概念で抽象化してまとめる

  • 外部からそのように定義されたものを受け付けるメソッドも定義されているのでメイン関数実行時に視聴するアニメを渡して上げることができる。


from abc import ABCMeta, abstractmethod

class Animation(metaclass=ABCMeta):
@abstractmethod
def bloadcast(self):
pass

class SSSSGridman(Animation):

def bloadcast(self):
return "gridman !!!"

class Jojo(Animation):

def bloadcast(self):
return "yareyaredaze !!!"

class Watcher():

def receive_fashion(self, animation):
if not isinstance(animation, Animation):
raise Exception("It's not ANIME")
self.animation = animation

def watch(self):
print("I watchd", self.animation.bloadcast())

if __name__ == "__main__":
watcher = Watcher()
watcher.receive_fashion(Jojo())
watcher.watch()
watcher.receive_fashion(SSSSGridman())
watcher.watch()
watcher.receive_fashion("あにめじゃないもの")


## 実行結果
I watchd yareyaredaze !!!
I watchd gridman !!!
Traceback (most recent call last):
File "DI_test.py", line 38, in <module>
watcher.receive_fashion("あにめじゃないもの")
File "DI_test.py", line 25, in receive_fashion
raise Exception("It's not ANIME")
Exception: It's not ANIME


参考にさせていただきました