[design-patterns] 5 살짜리에게 의존성 주입을 설명하는 방법? [닫은]

의존성 주입 을 설명하는 좋은 방법은 무엇입니까 ?

Google에서 몇 가지 자습서를 찾았지만 독자가 Java 초보자라고 생각하는 자습서는 없습니다. 이것을 초보자에게 어떻게 설명 하시겠습니까?



답변

다섯 살짜리 아이에게 의존성 주입을하겠습니다.

냉장고에 물건을 가져 가면 문제가 발생할 수 있습니다. 당신은 문을 열어두고, 엄마 나 아빠가 원하지 않는 것을 얻을 수 있습니다. 우리가 가지고 있지 않거나 만료 된 것을 찾고있을 수도 있습니다.

당신이해야 할 일은 “나는 점심으로 마실 것이 필요합니다”라고 말한 다음 식사를 위해 앉을 때 무언가를 가질 것입니다.


답변

이건 어때?

수업 Employee이 있고이 직원이있는 경우 다음과 같이 수업을 정의 Address 할 수 있습니다 Employee.

class Employee {
    private Address address;

    // constructor 
    public Employee( Address newAddress ) {
        this.address = newAddress;
    }

    public Address getAddress() {
    return this.address;
    }
    public void setAddress( Address newAddress ) {
        this.address = newAddress;
    }
}

지금까지 모든 것이 잘 보입니다.

이 코드는 직원과 주소 간의 HAS-A 관계를 보여줍니다 .

이제이 HAS-A 관계는 그들 사이에 종속성을 만들었습니다. 문제는 생성자 안에 있습니다.

Employee인스턴스 를 만들 때마다 인스턴스가 필요 Address합니다.

 Address someAddress = ....
 Employee oscar = new Employee( someAddress ); 

이 방법으로 작업하면 특히 단위 테스트를 수행하려는 경우 문제가 됩니다.

당신은 하나의 특정 오브젝트를 테스트 할 때 가장 큰 문제가되어, 다른 객체의 인스턴스를 생성해야하고, 가장 가능성이 아직의 인스턴스를 만들 필요가 다른 것을 할 개체를. 체인을 관리하기 어려워 질 수 있습니다.

이를 피하기 위해 다음과 같이 생성자를 변경할 수 있습니다.

  public Employee(){
  }

인수 없음 생성자를 사용합니다.

그런 다음 원하는 때에 주소를 설정할 수 있습니다.

 Address someAddress = ....
 Employee oscar = new Employee();
 oscar.setAddress( someAddress ); 

여러 속성이 있거나 오브젝트를 작성하기 어려운 경우, 이는 드래그 일 수 있습니다.

그러나 이것에 대해 생각해보십시오. Department속성 을 추가하십시오 .

  class Employee {
      private Address address;
      private Department department;

  ....

직원이 300 명이고 모든 직원이 같은 부서 를 가지고 있어야하며, 같은 부서를 회사의 다른 부서 (회사 목록 또는 각 부서의 역할 등)와 같은 다른 개체간에 공유해야하는 경우 Department객체 의 가시성에 어려움을 겪고 모든 객체 네트워크를 통해 공유하십시오.

뭐라고 의존성 주입은 그것에 대해 모두가 당신을, 잘하는 것입니다 “주입” 코드에서 이러한 종속성을. 대부분의 프레임 워크에서는 어떤 파일을 삽입할지 외부 파일에 지정하여이 작업을 수행 할 수 있습니다.

가상 의존성 인젝터에 대한 특성 파일을 가정하십시오.

  #mock employee
  employee.address = MockAddress.class
  employee.department = MockDepartment.class

  #production setup 
  employee.address = RealAddress.class
  employee.department = RealDepartment.class

주어진 시나리오에 대해 무엇을 주입할지 정의합니다.

Dependency Injector 프레임 워크에서 수행 할 작업은 올바른 객체를 설정하는 것이므로 setAddress또는 을 코딩 할 필요가 없습니다 setDepartment. 이것은 리플렉션이나 코드 생성 또는 기타 기술에 의해 수행됩니다.

그럼, 다음에 당신은 테스트해야 Employee당신이 모의 주입 할 수 클래스 AddressDepartments모든 시험을 얻을 / 코드에 모든 설정을하지 않고 개체를. 또한 프로덕션 코드에 실제 AddressDepartment객체를 삽입 할 수 있으며 코드가 테스트 된대로 작동한다는 확신을 가질 수 있습니다.

그것은 거의 그것에 관한 것입니다.

아직도 나는이 설명이 당신이 요청 한대로 5 세에 적합하다고 생각하지 않습니다.

나는 당신이 여전히 유용하다고 생각합니다.


답변

클래스를 작성할 때 다른 객체를 사용하는 것이 당연합니다. 예를 들어 데이터베이스 연결 또는 사용중인 다른 서비스가있을 수 있습니다. 이러한 다른 객체 (또는 서비스)는 종속성입니다. 코드를 작성하는 가장 간단한 방법은 다른 객체를 만들고 사용하는 것입니다. 그러나 이것은 객체가 해당 종속성과 유연하게 관계가 있음을 의미합니다. 객체를 호출하는 이유에 관계없이 동일한 종속성을 사용합니다.

보다 강력한 기술은 객체를 생성하고 사용할 종속성을 제공하는 것입니다. 따라서 사용할 데이터베이스 연결을 만든 다음 객체로 전달할 수 있습니다. 이렇게하면 다른 시간에 서로 다른 종속성을 가진 객체를 만들 수있어 객체가 더욱 유연 해집니다. 이것은 의존성 주입으로, 개체에 의존성을 “주입”합니다.

BTW : 개념을 설명하기 위해 플리커 사진을 사용하는 현대적인 프리젠 테이션 스타일에서 이는 마약 중독자 자신을 촬영하는 것으로 설명 될 수 있습니다. 아, 잠깐만, 그것은 주입 의존성이다 … 좋아, 미안, 나쁜 농담.


답변

내가 어떤 단순화 자습서 모르겠지만, 내가 당신에게 줄 수있는 거의 25 250 단어 또는없는 버전 :

의존성 주입을 사용하면 객체는 이미 알고있는 것을 기반으로 자체 구성 요소를 구성하지 않고, 더 높은 수준의 논리로 구성한 다음 내장 된 사전 지식이없는 구성 요소를 호출합니다. 이 개념은 객체를 구성 요소가 아닌 응용 프로그램이 아니라 구성 작업을 더 높은 수준으로 옮기는 것입니다. 따라서 나중에 또는 다른 구성으로 개체를 유용하게 사용할 수 있습니다.

테스트하는 것이 더 좋으며 응용 프로그램을 수정해야 할 때 더 좋습니다. 일반적인 구현은 구성을 XML로 만들고 프레임 워크를 사용하여 클래스를 동적으로로드합니다.


답변

새로운 Nintendo를 받으면 버튼과 터치 스크린을 사용하여 게임을 할 수 있습니다.

그러나 Nintendo 공장에서는 조립 방법을 알아야합니다.

공장의 현명한 직원이 Nintendo DS를 출시 할 때 내부가 달라 지지만 사용 방법을 여전히 알 수 있습니다.


답변