この記事はOIC ITCreate Club Advent Calendar 2019の7日目の記事です。
まえがき
DIについて書いている優良な記事は沢山ありますが、
なんか難しいこと言ってんな〜って思った人向けの記事です。
例としてScalaを使用していますが、
デザインパターンの解説がメインなので
Scalaわかんないよって人でも大丈夫です。
読み方
**"でぃーあい"**と読みます。
DIに必要なもの
以下の3つが必要なので用意します
- Interface もしくは trait
- 実装class
- DIコンテナ
Interface もしくは trait
実装を持たない関数を定義します。
言語によってInterfaceだったりtraitだったりしますが、やってることは一緒です。
今回はScalaを使用しているのでtraitです。
例
trait Hoge {
def hello()
}
実装class
traitを継承し、関数の中身を実装したclassです。
class名は、trait名 + Implになります。 (ImplはImplementの略!日本語で実装の意味!)
例
class HogeImpl extends Hoge {
def hello() {
println("こんにちは")
}
}
DIコンテナ
DIをするライブラリのことです。
ここではHogeを使用したときに、HogeImplがHogeに注入されるようにする設定をしています。
今回はPlayframeworkに標準でついているguiceを使用しています。
ライブラリに応じた設定をしてください
import play.api.inject.Module
import play.api.{Configuration, Environment}
class HogeModule extends Module {
def bindings(environment: Environment, configuration: Configuration) =
Seq(
bind[Hoge].to[HogeImpl] // ここで設定をしている
)
}
DIの説明
HogeImplを使用するのではなく、Hogeを使用します。
えっ、Hogeは実装書いてないし動かなくない?って思いますが、
それをいい感じにしてるのがDIです。
コンパイル時または実行時に、DIコンテナは設定されている通りに置き換えます。
HogeImplに置き換わるので、
Hoge.hello()
を実行すると、
こんにちは
出力されます
この置き換える仕組みがDIです。
あとがき
DIして何が嬉しいかとかは、他の優良記事を参考にしてください。