依存性の注入(Dependency injection)についてド素人が調べてみる

徒然草2.0

Dependency injection(ディペンデンシー・インジェクション)について教えてくださいと言われたけれど適当PHPerの私にはわかりませんでんしー。

⋯というわけで、DIの要件についてまとめてみた。

DIの要件

  • 外部ファイルから依存性を注入する。
  • 依存関係を外部ファイルに持ちソースコード上に持たない。
  • コンポーネント間の関係はインターフェースで記述する。
  • 具体的な関係性は外部ファイルに記述する。
  • コンポーネント間の依存性を下げることができる。

※補足1⋯上記の説明はオブジェクト指向の設計であることをエポケー(一時的に忘れることを)しており、外部ファイルとは例えばアプリケーションやDBの設定情報である。ファイル形式はJSONファイル、CSVファイル、その他の設定ファイルを想定した定義だが、何らかのデータであるものはすべて依存性の対象である。外部ファイルの他に、クラスファイル、データベースの接続情報、APIキーや接続文字列、何らかの外部サービス(メール送信、SMS送信、WEB-APIなど)の場合もある。

※補足2⋯注入方法は通常はコンストラクタもしくはセッターである。

DIの利点

  • コンポーネントの結合度が下がる
  • 単体テストがしやすい
  • フレームワークに依存しない

参考リンク

やはりあなた方のDependency Injectionはまちがっている。

やはりあなた方のDependency Injectionはまちがっている。 — A Day in Serenity (Reloaded) — PHP, CodeIgniter, FuelPHP, Linux or something
  • DIコンテナとDIの違いを教えてくれている。
  • dependencyとは依存性ではなくオブジェクトであるそうだ。
  • オブジェクトAが内部オブジェクトBを使う関係ではなく、関係性を外部から注入する。もっと正しくざっくり言うと外部からオブジェクトを注入して使用する。その外部からオブジェクトを注入する行為をDIと言う。このようにコンポーネント間の疎結合性を担保して、各コンポーネントの独立性を高めることが大切なんだと思われる。

…外部から使用するオブジェクトをぶっ込む(インジェクション)する一連の仕組みと捉えておけばだいじょうぶだということ。Springboot2などのコードを見ていて、なんか無駄だとしか感じなかったんだけど、なんとなくわかった。ちなみに自分はクラス密結合のコードを書いているということや、一連の技術を調べていて親クラスを共通メソッドなどを定義して呼び出す行為は親クラスを神クラスに仕立て上げて依存性を生むということを改めて再認識した。1人でつくっていると、アンチパターンにはまる。なぜハマるのか?DIPとデザインパターンを理解していないからである。

補足:依存性注入(DI)と依存性逆転の法則(DIP)

Spring boot 3でDDDとデザインパターンを学んだことで雑な理解をしていたことに気づいたので補足する(2025/04)。依存性逆転の法則(DIP)とは、設計原則であり抽象(≒インターフェース)に依存する設計を指しており、依存性注入(DI)をうまく使った設計のことである。

DIのみの場合は「DB接続情報を外部から注入する」だけだが、DI+DIPの場合は「DB接続情報外部から注入するインターフェース+DB接続情報外部から注入するメソッド」で構成される。

※補足:SOLID原則のほとんどの項目と、デザインパターンにおけるStrategyパターンは、このDI+DIPにより実装していることになる。

徒然草2.0
スポンサーリンク
シェアする
gomiryoをフォローする
ごみぶろぐ

コメント

タイトルとURLをコピーしました