Something like blog

< ノブレスオブリージュ | 客観視 >

2018/08/28

DIは「動的依存関係」

DI(Dependency Injection)を日本語にする時、だいたい「依存性の注入」という訳が当てられていると思います。

直訳するとDependencyが「依存」で、Injectionが「注入」になるので、それをそのままつなげて「依存性の注入」としたのでしょう。

ただこれだと「注入」の方は何かを何かに入れるんだな、というのがなんとなく分かりますが、「依存性」が具体的に何を指すのかさっぱり分かりません。

そもそも依存性が何かから何かに移動したら、それはもう依存とは言わないのでは?など、単語にはなっているけど現実世界においては全く具現化できない粉末水素水みたいなことになっています。

自分はJavaのSpringフレームワークを扱う際にDIという単語と概念に出会いました。

しかし、結局その現場を去ったあともDIが具体的にどういうことなのかさっぱり分かりませんでした。

そこで、rubyのシンプルなコードで分かりやすく説明してみます。

class Hoge
  attr_reader :bar
  def initialize
    @bar = Object.new
  end
end

hoge = Hoge.new

というコードが合った場合hoge.barオブジェクトはHogeクラスのコンストラクタにべた書きされているので、hogeインスタンスに強制的に結びつくことになります。

インスタンス生成者はHogeクラスをいじれない限りhoge.barに干渉することはできません。(やろうと思えばできます)

基本的にhogeのインスタンスメソッドでない限り@barの内容はいじれないことになっています。

このコードを以下のように書き換えます。

class Hoge
  attr_reader :bar
  def initialize(bar)
    @bar = bar
  end
end

hoge = Hoge.new(Object.new)

この場合、hoge.barオブジェクトはhogeインスタンスを生成する時に生成者が好きなものを指定することができます。

最初のコードだとhogeインスタンスに強制的に結びついていたものが、インスタンスの生成者が@barオブジェクトを自由に指定できるようになっています。

インスタンスとインスタンスオブジェクトの関係を動的に結びつけてあげられるようにする、というデザインパターンがDIです。

dependencyはOALDで以下のように定義されています。

dependency (on/upon somebody/something) the state of relying on somebody/something for something, especially when this is not normal or necessary

依存性というよりかは「何かが何かしらに頼っている状態」という意味だから、Dependency Injectionは「ある状態」を「何かしら」にinjection(注入)して結びつけることにより依存関係を築く、という意味になるのです。

上記のコードだと「Objectクラスのインスタンス」を「Hogeクラスのインスタンス」に注入して結びつけて、「Objectインスタンス」が「Hogeインスタンス」に依存する関係になった、ということです。

ですので「動的依存関係」ぐらいの訳にしておけば、まだ分かりやすく意味の通る言葉になっていたはずです。

Post a comment

Name: