Dependency Injection

アーキテクチャを考えると理解せざる負えない概念。

依存性の注入(いそんせいのちゅうにゅう、英: Dependency injection)とは、コンポーネント間の依存関係をプログラムのソースコードから排除し、外部の設定ファイルなどで注入できるようにするソフトウェアパターンである。英語の頭文字からDIと略される。

わからない。

ここの記事を参考にしながら咀嚼してみる。 俺がある程度分かる言語はgolangなので、golangを中心に考えていく。

interface

interfaceを使って、モジュール間の依存レベルを下げる。それはテストコードとかを書く経験をして、必要だと思った。
例えば、下記のコード

type Bitcoin struct{  
  bitcoin BitcoindRepo
}

func NewBitcoin(bitcoin BitcoindRepo) *Bitcoin{  
  return &Bitcoin{
    bitcoin:bitcoin,
  }
}

func(B Bitcoin) GenerateAddress()([]Address,error){  
  return B.Generate()
}

でレポジトリとして、

type Bitcoind interface{  
  GenerateAddress()([]Address,error)
}

func NewBitcoind(){  
  return &Bitcoind{}
}

こんなコードがあったとき、どうやってレポジトリを生成するかが問題。 例えば、Service側で、

func(B Bitcoin)initBitcoind(){  
  B.bitcoin := NewBitcoin()
}

とかやったら、結局きりわけることができない。そこでDIが登場すると。

dependency injection

この依存性を別の箇所から実施するもの、これをdependency injectionと呼ぶ。 さっきの場合であれば、serviceでやるんじゃなくて、呼び出しもとで

Bitcoind := NewBitcoind()  
Bitcoin := NewBitcoin(Bitcoind)  

って感じにすれば良い。

で、このさきにDI containerがある。これは別の場所で理解を深めよう。