依存性は?DI(Dependency Injection)


<依存性?>

  • オブジェクト向けの2つのクラス間の関係
  • 一般的な2つのうちの1つは、別の
  • を必要とする
        public class CPU { }
        
        public calss Computer{
        	private CPU cpu;
            
            public Computer(){
            	cpu = new CPU();
            }
        }
  • コンピュータは、CPUオブジェクト
  • を生成する.
  • CPUが変更する場合、コンピュータクラスも
  • に変更する必要があります.
  • コンピュータのCPU依存性
  •  public class Computer{
     	private CPU cpu;
        
        public void setCPU(CPU cpu){
        	this.cpu = 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の内部フィールドやメソッドパラメータを変更する必要がなくなりました.

    <ライブラリ>

  • Koin
  • Dagger2
    JavaとAndroidに強力で迅速な依存注入フレームワークを提供し、多くの開発者が
  • を使用しています.