DI(Dependency Injection : 依存性の注入)とは
概要
依存していた部分を外から注入すること
依存性 : クラスやメソッドに固定の値(変数や定数)が入っていること = そのクラスはその定数、変数、インスタンスに依存している = 状態を持っていること
注入 : クラスやメソッド内に持っていた固定の値を外から渡すということ
注入方法
Interface Injection : メソッドの引数に使いたいオブジェクトを渡せるようにする
Constructor Injection : 使う予定のオブジェクトをコンストラクタに渡せるようにする
Setter Injection : オブジェクトをSetterメソッドで渡せるようにする
Interface Injection
code:injection.kt
// 依存している例
fun echoNum(){
val num : Int = 10
println(num)
}
// 依存性をなくした例、メソッド内に固定の値を持たせない為に値を引数で渡す
fun echoNum(num : Int){
println(num)
}
Constructor Injection
code:injection.kt
// 依存している例、hogeというメソッドはvalidatorに依存している
class Hoge(){
fun hoge(params : Any){
val validator = Validator
validator.validate()
}
}
// 依存していない例、コンストラクタでValidatorインスタンスを生成する
class Hoge(validator Validator?){
var validator : Validator
init {
this.validator = validator ?: Validator();
}
fun hoge(params : Any){
this.validator.validate()
}
}
Setter Injection
code:injection.kt
// クラスにオブジェクトを注入する為に、セッターメソッドを使用する
// Kotlinではあまり意味がないかもしれない
class Hoge(){
var value : Int
fun setValue(value Int){
this.value = value
}
fun hoge(){
println(this.value)
}
}
メモ
内部で依存先をnewするのではなく、外から依存先の実装を設定させる(使用者に責任を持たせる)
依存先のクラスを固定するのではなく、interfaceを使用する
interfaceを継承して実際に使うクラスとモック用のクラスそれぞれを実装できる