依存性は?DI(Dependency Injection)
<依存性?>
public class CPU { }
public calss Computer{
private CPU cpu;
public Computer(){
cpu = new CPU();
}
}
public class Computer{
private CPU cpu;
public void setCPU(CPU cpu){
this.cpu = cpu;
}
}
<なぜ依存性を注入する必要があるのか>
ただし、ユーザーは異なるタイプのCPUを使用することを望んでいる可能性があります.
たとえば、A社のCPUを使用してコンピュータを作成する場合は、既存のCPUクラス名をCPU Aに変更するか、再作成する必要があります.
クラスを変更または新規作成するのは難しくありませんが、CPUクラスに依存するコンピュータクラスも変更する必要があります.
public class Computer{
private CPU_A cpu; // A로 변경됨
public Computer(){
cpu = new CPU_A(); // 이 부분 역시 변경됨
}
}
クラスを変更すると、変更が別の依存関係に移行することがわかります.この問題を解決するために,コンピュータに依存するCPUをインタフェースとした.
CPUを実現したクラス間でコンピュータのCPUを用いて機能を実現する
public interface CPU {...}
public class CPU_A implements CPU {...}
public class Computer{
private CPU cpu;
public Computer(){
cpu = new CPU_A();
// cpu = new CPU_B();
}
}
しかし、まだ問題がある.B CPUを使用する必要がある場合は、コンピュータクラスを再変更する必要があります.制御反転は、制御権を任意の作業を実行するフレームワークに委任することによって注目点を分離することを意味する.
public class Computer{
private CPU cpu;
public Computer(){}
public Computer(CPU cpu){
this.cpu = cpu;
}
public void setCPU(CPU cpu){
this.cpu = cpu;
}
}
public static void main(String[] args){
CPU cpu = new CPU_B;
Computer cmp1 = new Computer(cpu);
// Or
Computer cmp2 = new Computer();
cmp2.setCPU(cpu);
}
コンピュータクラスの作成者にCPUオブジェクトを作成するのではなく、外部からCPUオブジェクトを作成し、コンピュータ作成者またはメソッドのパラメータとしてオブジェクトを提供します.以前はコンピュータがCPUオブジェクトを作成管理していましたが、改良されたコードはCPUオブジェクトの作成と管理を外部に委任しました.
これを制御の逆転と呼ぶ.
反転制御により結合度が低下し、CPUの内部フィールドやメソッドパラメータを変更する必要がなくなりました.
<ライブラリ>
JavaとAndroidに強力で迅速な依存注入フレームワークを提供し、多くの開発者が
Reference
この問題について(依存性は?DI(Dependency Injection)), 我々は、より多くの情報をここで見つけました https://velog.io/@nimok97/의존성이란-DIDependency-Injectionテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol