しらとりのブログ

社会人ひよこプログラマのtil

依存性の注入って字面がやばい

あぶない薬か何かでしょうか…???この用語を知らない人の前で口に出すといろいろ誤解されそうですね。 英語だと"Dependency Injection"です。

TR;DR

依存性の(ある物の)注入。
やっぱり字面はやばい……

依存性とは

プログラミングの文脈で依存といえば思い浮かぶのがクラス図で出てくる関連性を表すうちの1つで出てくる「依存」。UML2.0の仕様書では"usage dependency"と書かれています。あとは依存関係逆転の原則とかでも聞いたことがあります。「具象ではなく、抽象に依存せよ」のアレです。英語だと"Dependency Inversion Principle"。なんだか意味は近そうですね。

なんにせよ結合度で測れるあの依存で間違いないみたいです。クラスAの中でクラスBを利用している時に、Bの修正を行うとAも修正する必要がある状態をAはBに依存している状態だとか言います。よくある委譲による継承パターンでラッパークラスでnewしていたりするともろに依存している形ですね。

このときにラップされるクラスのインスタンスをラッパークラスの外から渡してあげるテクニックを依存性の注入というそうです。渡し方は単純にコンストラクタで渡したり、セッターで渡したりです。完全にコードから排除する場合にはDIコンテナというものを使うとXMLとかの外部設定ファイルからオブジェクトを作れたりするそうです。

用語にすると難しく聞こえますがインターフェースを用意しておいてスタブと本番モジュールを切り替え、とかよくやると思います。そのインスタンスの設定をどうやるかの問題の話でした。