2tech2020/4/6更新:DIの説明に関して誤解を招く表現があったため内容を更新しましたはじめにあなたはDI(依存性の注入)という言葉を初めて聞いたときに、その意味をイメージできましたか?私はできませんでした。何に対する依存性を何に注入する、、?そもそも「依存性」って何?(実装したことがない!)と、次から次へと疑問が溢れ出てきました。いう言葉を聞いたのは、新卒で入社して初めて案件(Androidアプリ)にアサインされたときです。実装されており私自身も見様見真似で「DIなるもの」の実装を行いました。何かをきちんと理解できていなかったため、ただただ記述するコードが増えて複雑だな、面倒だなと感じていました。理解しようと考えました。ついて調べた経緯をそのまま書いていこうと思います。このような構成にした理由は、自分が何に疑問を持っていたのかを把握することで、初心者にとって理解しやすい文章を書けるのではないか、後輩に教える際に役立つのではないかと考えたからです。DIについての説明だけを読みたい方は、こちら:Wikipediaを読んでをご覧ください。対象者この記事の読者として想定しているのは、以下のような人たちです。使ったことあるけど、結局あれは何をやってたんやろ?と疑問を持っている人DI(依存性の注入)とは依存性を注入するということである。安心してください、この記事を読み終える頃には「なるほどー」と思ってもらえるよう頑張ります。私が学習した経緯を記載していきます。ついて調べることにしました。読んでみることをオススメします。Wikipediaを読んでDI誕生の経緯DI誕生の経緯を簡単に話します。せずに、あるオブジェクト内で外部のオブジェクトをインスタンス化してしまっている場合を見てみます。問題点:Foodクラスのeat()メソッドにて、外部のAppleクラスをインスタンス化しているつまり、Foodクラスのeat()メソッドはAppleクラスに依存しているなぜ問題か:eat()メソッドの処理内容を直接編集するか、Appleクラスを編集しない限り、eat()メソッドの処理結果は変化しないから。食品(Food)はリンゴ以外にバナナやチーズもあるはずで、さらにリンゴの中にも毒入りと毒なし2種類あるはずなのに、食品(Food)を食べる(eat)ときの結果は常に同じ挙動(常に「リンゴ美味しかったー」)になってしまうから。単体テストを行いづらいから。eat()メソッド内でif文に問題がないかなどを確認するためには、Appleクラスを書き換えるしかありません。これではテストコード(doSomething()メソッド)だけでテストすることは不可能になってしまうのです。こんなメソッドどこで使うねん!どうやってテストするねん!柔軟性がなさすぎる。DI(依存性の注入)するようにしよう!これが、DI誕生の経緯です。DI誕生の経緯を抽象的に説明し直します。あるオブジェクトAがオブジェクトBに依存してしまう、つまりオブジェクトAが別のオブジェクトBを持ってしまうのは、使用する際の柔軟性のなさやテストのしにくさの観点から見て、良くない。考え方を取り入れた簡単な例を以下に示します。実行結果:バナナを食べると元気が出るDIには種類があるWikipediaでは1行ずつで簡潔にまとめられていますが、自分なりに補足してみました。インターフェースに該当すると思います。似たようなことは誰もが当たり前のように実装しているのです。前項で使用したeat()メソッドを用いて説明します。}}何が変わったのでしょうか?Appleクラスを引数で渡すよう修正しただけです。「依存性」の言い換え「依存性」という言葉が理解の妨げとなっているのではないかと思い、以下のような言い換えを考えてみました。Wikipediaでは、以下のように「依存性」は「オブジェクト」であると記載されています。Swiftで言うところのprotocolを批准しているクラス内で処理内容を実際に記述しているデリゲートメソッド次に「注入」を付け足して「依存性の注入」という言葉を言い換えてみます。「依存性の注入」とは(オブジェクトAの外部から)「オブジェクトAで必要な、オブジェクトBの実態(インスタンスや具体的なメソッド)」を「注入/代入/設定/提供」することであると言葉を付け足して説明してみました。ここでオブジェクトはクラスやメソッドに該当します。しましたでしょうか?これだけだと、まだモヤッとするかもしれません。DI手法に応じて言い換えてみます。DIの例を添付しておきます。}}DIするメリット最後に、これまで各所で説明してきたメリットを再度提示します。上記3つのメリットは、Wikipediaより引用。導入しその概要をまとめようと考えています。対象者DI(依存性の注入)とは依存性を注入するということである。Proよくある質問LinksX(Twitter)GitHubメディアキットLegal利用規約プライバシーポリシ。