4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

DIをクッソ雑に説明

Last updated at Posted at 2019-12-07

この記事は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して何が嬉しいかとかは、他の優良記事を参考にしてください。

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?