0
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

DIをクッソ雑に説明

この記事はOIC ITCreate Club Advent Calendar 2019の7日目の記事です。

まえがき

DIについて書いている優良な記事は沢山ありますが、
なんか難しいこと言ってんな〜って思った人向けの記事です。

例としてScalaを使用していますが、
デザインパターンの解説がメインなので
Scalaわかんないよって人でも大丈夫です。

読み方

"でぃーあい"と読みます。

DIに必要なもの

以下の3つが必要なので用意します

  1. Interface もしくは trait
  2. 実装class
  3. DIコンテナ

Interface もしくは trait

実装を持たない関数を定義します。
言語によってInterfaceだったりtraitだったりしますが、やってることは一緒です。
今回はScalaを使用しているのでtraitです。

Hoge.scala
trait Hoge {
  def hello()
}

実装class

traitを継承し、関数の中身を実装したclassです。
class名は、trait名 + Implになります。 (ImplはImplementの略!日本語で実装の意味!)

HogeImpl.scala
class HogeImpl extends Hoge {
  def hello() {
    println("こんにちは")
  }
}

DIコンテナ

DIをするライブラリのことです。
ここではHogeを使用したときに、HogeImplがHogeに注入されるようにする設定をしています。

今回はPlayframeworkに標準でついているguiceを使用しています。
ライブラリに応じた設定をしてください

module.scala
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です。
スクリーンショット 2019-12-07 22.14.23.png

コンパイル時または実行時に、DIコンテナは設定されている通りに置き換えます。

スクリーンショット 2019-12-07 22.32.07.png

HogeImplに置き換わるので、
Hoge.hello()を実行すると、
こんにちは出力されます

この置き換える仕組みがDIです。

あとがき

DIして何が嬉しいかとかは、他の優良記事を参考にしてください。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
0
Help us understand the problem. What are the problem?