DIパターン
DIパターンとは、システム開発においてソフトウェア設計のパターンの1つです。クラス、オブジェクトの依存関係を外部から注入します。
例えば、あるクラスAが必要なクラスBのオブジェクトを直接生成して使用してしまうと、クラスBの修正や追加機能が発生した場合にクラスAの修正も行う必要が出てきます。
DIパターンはこのクラス間の依存関係を外部から注入することで、クラスAの修正は不要になります。
また、DIパターンによりテストも容易に実施することが可能です。
DIパターンを使用しない場合
class Database:
def connect(self):
return "Connected to database"
class UserService:
def __init__(self):
# ここで直接依存関係をインスタンス化している
self.database = Database() #DBの使用変更や、使用するクラスが変わる場合UserServiceクラスを書き換えて修正しないといけない
def get_user_data(self):
return f"User data from {self.database.connect()}"
# インスタンス生成
user_service = UserService()
# メソッドの呼び出し
print(user_service.get_user_data())
userServiceクラスで直接Databaseクラスを使用してしまっているため、Databaseクラスの入れ替えや変更時には、UserServiceクラスにも修正が発生してしまいます。
DIパターンを使用した場合
class Database:
def connect(self):
return "Connected to database"
class UserService:
def __init__(self, database: Database):
self.database = database
def get_user_data(self):
return f"User data from {self.database.connect()}"
# 依存性を注入
database = Database()
user_service = UserService(database)
print(user_service.get_user_data())
UserServiceクラスは直接Databaseクラスを使用しておらず、コンストラクタでDatabaseクラスのオブジェクトを受け取って自身のインスタンス変数に設定しております。
もし、Databaseクラスの代わりに別のクラスを使用するとなった場合でもUserServiceクラス内では直接使用していないので、影響がありません。
また、このような設計にしておくことでテストも容易に行うことが可能になります。