>

다음은이 게시물을위한 일반적인 가상의 예입니다. 6 개의 수업을 고려하십시오

TableFactory, TableData, TableCRUD, TableSchema, DBConnect, Logger.

TableFactory  외부 클래스입니다. TableData 를 가지고 있다고 가정 해 봅시다.  DB 테이블의 객체.

TableFactory 에서 , TableSchema 에 대한 전화가 없습니다  또는 DBConnect  또는 logger . 외부 범위에서 필요하지 않은 내부 객체의 예를 목표로합니다.

TableData  내부 페치이며 데이터에서 작동하므로 TableCrud 가 필요합니다. DBConnect  그리고 Logger .

TableCrud    TableSchema 포함  그리고 DBConnect 가 필요합니다 및 Logger .

DbConnect  사물을 재미있게 만들려면 로거가 필요합니다. 내 예는 이제 3 스코프 깊이입니다.

내 질문은 아주 간단합니다. 외부 범위의 객체가 호출하지 않는 객체 3 (또는 그 이상) 범위가있는 경우 인터페이스를 깨지 않고 어떻게 외부 객체를 내부 범위로 보냅니 까? 분리 원칙->TableFactory는 내부 객체에 필요한 DBConnect 또는 로거를 처리 할 필요가 없습니다.

기본 OOP 원칙을 존중하고 쉬운 테스트 가능성을 목표로하는 경우, 5 개의 객체를 주입해야하는 외부 객체를 보유한 다음 체인 위로 추가로 필요한 객체를 통과시키는 게터 메소드를 갖게됩니다. 그리고 내부 범위가 지정된 객체는 내부 3 범위의 깊은 객체의 종속성을 가져오고 해당 객체에 대한 게터도 필요합니다. 이것은 많은 의존성을 요구하는 외부 범위의 객체를 만들고 getter는 그 객체를 전달합니다.

이 객체 전달 방법론에 대한 대안이 있습니까? 공유하십시오! 모든 링크/의견에 감사드립니다.

  • 답변 # 1

    종속성이 객체 그래프를 통해 전달되어야한다는 것은 일반적인 오해입니다. Miško Hevery가 Clean Code로 제공 한 예를 요약하면 : 문이 필요한 집을 찾지 마십시오. 도어 잠금 장치에 대해 알 필요가 없습니다 :

    class HouseBuilder
    {
        public function buildHouse()
        {
            $lock  = new Lock;
            $door  = new Door($lock);
            $house = new House($door);
            return $house;
        }
    }
    
    

    보시다시피, House는 Door에 자물쇠가 필요하다는 사실을 완전히 잊어 버렸습니다. 필요한 모든 종속성을 작성하고 필요에 따라 함께 쌓는 것은 HouseBuilder의 책임입니다. 내부에서.

    결과적으로 시나리오에서 어떤 개체가 어떤 종속성에서 작동해야하는지 식별해야합니다 (참조 Demeter of Law). 그런 다음 빌더는 모든 공동 작업자를 작성하고 종속성이 적절한 오브젝트에 삽입되도록해야합니다.

    단위 테스트와 관련하여"새로운"운영자에 대해 생각하는 방법도 참조하십시오

  • 답변 # 2

    같은 질문에 걸려 넘어지면 황소의 눈에 부딪 치는 허비의 기사를 확인하십시오

    http://misko.hevery.com/2008/10/21/dependency-injection-myth-reference-passing/

    이 기사가 미래에 사라지는 경우 발췌 부분입니다

    "모든 객체는 단순히 직접 상호 작용하는 객체에 대해 알고 있습니다. 필요한 객체를 올바른 위치로 가져 오기위한 객체 참조 전달은 없습니다."

    따라서해야 할 일은 종속성을 위에서 아래로 전달하고 가로로 이동하여 다른 곳에서 종속성을 관리하는 깊은 중첩 된 객체 그래프를 만드는 것입니다.

관련 자료

  • 이전 apache - Htaccess 다시 쓰기를 사용하여 URL에서 쉼표로 구분 된 16 진수 값을 캡처하고 쉼표를 대시로 바꾸는 방법
  • 다음 javascript - 이 내부 기능