1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

コンストラクタインジェクションについて深掘り

Posted at

Dependency Injection (DI) の基本

DIについて知りたくなった

コンストラクタインジェクションとは?

コンストラクタインジェクションは、依存関係をクラスのコンストラクタを通じて注入する方法です。具体的には、クラスが必要とする依存関係を、コンストラクタの引数として受け取ることによって実現されます。

  1. コンストラクタインジェクションの利点
    明確性: コンストラクタで必要な依存関係が明示されるため、クラスの動作に必要なものが一目でわかります。
    不変性: 一度インジェクションされた依存関係は変更されないため、安全性が向上します。
    テスタビリティ: モックオブジェクトやスタブを簡単に注入できるため、ユニットテストが書きやすくなります。
  2. Pythonにおける実装例
    以下は、Pythonを使ったコンストラクタインジェクションの簡単な例です。
class Database:
    def save(self, data):
        # データ保存のロジック
        pass

class UserService:
    def __init__(self, db: Database):
        self._db = db

    def add_user(self, user_data):
        self._db.save(user_data)

# 使用例

db_instance = Database()
user_service = UserService(db_instance)
user_service.add_user({"name": "John Doe", "email": "john@example.com"})

Database クラスの定義
このクラスはデータベースに関連する処理を模倣しています。
save メソッドは、データをデータベースに保存する機能を模しています。ここでは具体的な実装は省略されており、実際にはデータベース接続やデータの保存ロジックがこの中に書かれることになります。

UserService クラスの定義
このクラスは、ユーザーに関連する処理を担当します。
コンストラクタ init は、Database のインスタンスを引数として受け取ります。これがコンストラクタインジェクションの核心部分です。UserServiceはDatabaseの機能に依存していますが、直接インスタンスを生成するのではなく、外部からインスタンスを受け取る形となっています。
add_user メソッドは、ユーザーデータをデータベースに保存するために、内部でDatabaseのsaveメソッドを呼び出します。

使用例部分
まず、Database クラスのインスタンス db_instance を作成します。
次に、この db_instance を引数として UserService クラスのインスタンス user_service を作成します。この時点で、UserService の内部には Database のインスタンスが注入されています。
最後に、user_service の add_user メソッドを呼び出し、ユーザーデータをデータベースに保存します。このメソッド内部で、前述した Database の save メソッドが呼び出されることになります。

1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?