LoginSignup
10
11

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-11-11

月曜日の夜なのに眠れないので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

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

10
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
11