はじめに
インタフェースとDIってなくても実装できるのに何で必要なの?と思ったのでこの記事にまとめました。言語の学習の際につまずく要因として「何その考え?」ということが多いと思いますが、これを理解しておくのとしないのでは現場での活躍度が遥かに変わってくると思います。
図を用いて解説します。
インタフェースとは?
メソッドの具体的な処理は記載せずに「変数」「メソッドの型」を明記したもの。要約すると、
他のクラスで使用する変数とメソッドが明記されたファイル。
インタフェースのメリットと使い方はこちらで詳しく記載しています。
DIとは?
DIとは、外部の環境などに依存する部分(データへのアクセスなど)を切り離し、 ソフトウェアの外部から提供できるようにするという考え方です。 (引用:Webアプリケーション開発教材 DIコンテナ)クラス間との疎結合※ができることによって保守性が上がります。
※疎結合とは、クラス同士の結びつきが弱く独立性のある状態のことを指します。逆にクラス同士の結びつきが強いものを蜜結合といいます。
▼図で理解を深める
改修、拡張しやすいように3層に分けているにも関わらず自身のクラス内でnewしてインスタンスを生成しているのでお互い強い依存関係になっている。
一方、疎結合は
①同様に各層毎にクラスが存在する。
この時はまだお互いのクラスに依存性はない。
②蜜結合にしないためにインタフェースを各層のクラス間に定義する。(インタフェースを作成し「変数、メソッドの型」を作成する)
このインタフェースを実装する形でビジネスロジック層の[Serviceクラス]、データアクセス層の[ServiceOdaクラス]をを実装していく。
③値を受け取るにはインタフェース型の変数を用意しておく。
インタフェースの実装クラスである[Serviceクラス]のオブジェクトを[Controlクラス]に外から渡してあげる。(ServiceOdaクラスも同様)
こうすることで、自分のクラス内に他のクラスを指定して記載する必要がない!ということになります。
④外から渡すために別のクラスを用意し、そのクラス内でnewして渡してあげることで依存性が解消されます。
このように外からオブジェクトを渡すことを「DI※」と言います。
DIの仕組みを使うことで直接newすることなくインスタンスを生成することができ依存性が解消されます。
※DI:Dependeny Injection(依存性の注入)と言い、分かりやすく言い換えると「オブジェクトを外から渡す」ということになります。
DIについて理解するまでもう一歩!
④の時のようにクラスを用意してDI化することも可能だが、一般的には「DIコンテナ」というものがフレームワークから提供されているのでそちらを使います。DIコンテナの中で今回だと、[Service][ServiceDao]のオブジェクトを作成して渡してあげることができます。
まとめ
DIを使うと今まで依存関係があったクラス間を切り離すことができ、保守性が向上し、依存性が解消される。この解説動画おすすめでした。
(注:職場のPCで閲覧されている方はお気を付けください!YouTubeに遷移します。)