Dependency Injection

PHPエンジニア養成読本という本の「PHPUnitではじめる自動テスト」という項目でこの言葉を知りました。

Dependency Injection。DIと略されるそうで、日本語では依存性注入というらしい。

PHPエンジニア養成読本では、あるクラスのユニットテストをしたいのに、そのクラスが他のクラスに依存していてそこを外部から差し変えれないとユニットテストできないからそういう依存は外部から設定できるようにしたらいいよというような説明だったと思います。

初めて知ったのでいろいろと Google したところ、以下のページがわかりやすかったかなーと思いました。

Dependency Injection の基本的なアイディア

要するに、あるクラスが他のクラスを使おうとした場合にクラスの内部で他のクラスを使おうとせずにコンストラクタやメソッドの引数として渡して使おうということだと思います。

DI には3種類あるらしい。

  • コンストラクター・インジェクション
  • セッター・インジェクション
  • インターフェース・インジェクション

効果としては、

  • クラス間を疎結合にできる
  • 依存を外部から設定できるので、ユニットテストなんかでそこをモックに差し変えたりできるのでユニットテストができる

依存するクラスのインスタンスなんかを設定するということをしないといけないため、そこの手間が増えるけど、

  • ファクトリーメソッドを作る
  • DIコンテナを使う

のようなことをするらしい。

DIコンテナというものがよくわかっていない (何のためのものかはわかったが、仕組みというか使い方というかなんというかがわかっていない) が、というか使ってないからわからないもなにもない。

まあ、外部依存の設定の複雑度に合わせて 「何も使わない」 → 「ファクトリーメソッドを使う」 → 「DIコンテナを使う」みたいなかんじにしていけばよいのではと適当に思っているので必要になったときに調べればいいのではないだろうか。

ファクトリーメソッドって言葉だけ知っていていまいち何に使うのかよくわからなかったけど、これに使うんですかね。

「クラス間は疎結合にしたほうが良い」とか「普段からユニットテストしててモックやらスタブやらバリバリだぜ」という人は、こんな言葉知らなくても自然にやってそう。

とりあえず適当にメモ。