🙌

DIについて改めて学ぶ

2023/03/04に公開

業務でたまにDIコンテナを使用していますがあまりDIについて理解が及んでないのでDIについて概要をまとめてみました。
ここではオブジェクト指向での実装を前提とします。

DIとは

依存性の注入(いぞんせいのちゅうにゅう、英: Dependency injection)とは、あるオブジェクトや関数が、依存する他のオブジェクトや関数を受け取るデザインパターンである。

https://ja.wikipedia.org/wiki/依存性の注入

Classでの実装だとConstructorやmethodの引数でオブジェクト(関数)を受け取る実装パターンと言える

public function openFile()
{
    $file = new CsvFile();

    $file->open()
}

上記の例を下記の例に↓

public function openFile(File file)
{
    $file->open()
}

DIで実装すると何が嬉しいの?

  • モジュール同士が疎結合(緩やかな結合)になる
    • 上記の場合だと具象化されたクラスへの依存を無くせる

そもそも依存とは...

他に頼って在ること、生きること。人間の赤ん坊は、ほかの動物に比べてはるかに未成熟の状態で生まれるた
め、長い期間にわたって独力で生きていくことができず、周囲の大人、とくに母親からの扶養に頼らなければならない。

https://kotobank.jp/word/依存-715

疎結合になると具体的にどういうメリットが生まれるのか?

  • 依存先のクラスが実装できていなくても仮のクラスを用意して利用できる
  • 外部APIなどが絡むテストがしやすくなる
  • HogeInterfaceを実装した(継承も同様)クラスを全て同列に扱うことができるので拡張性の高い実装が可能

DIコンテナ

  • DIを実現させるためのツール・ライブラリ
    • クラスの利用者(注入する側)からだと注入するオブジェクトが増えると管理が大変すぎるし非現実的
    • なので依存関係の設定場所を一箇所にまとめて管理する
    • そして利用するインスタンスをコンテナから取得する

Discussion