주사를 받아들이지 않고 직접 의존성을 구성하는 1001 명의 고객이 있다고 가정 해보십시오. 보스에 따르면 1001을 리팩토링하는 것은 옵션이 아닙니다. 실제로는 소스 파일뿐만 아니라 클래스 파일에도 액세스 할 수 없습니다.
우리가해야 할 일은이 1001 클라이언트가 통과하는 시스템을 "현대화"하는 것입니다. 우리가 좋아하는 모든 것을 리팩터링 할 수 있습니다. 종속성은 해당 시스템의 일부입니다. 그리고 이러한 의존성 중 일부는 새로운 구현으로 변경되어야합니다.
우리가하고 싶은 것은이 다수의 클라이언트를 만족시키기 위해 다양한 의존성 구현을 구성 할 수있는 능력이 있다는 것입니다. 안타깝게도 DI는 클라이언트가 생성자 또는 설정자를 사용한 주입을 허용하지 않기 때문에 옵션으로 보이지 않습니다.
옵션 :
1) 클라이언트가 현재 필요한 것을 수행 할 수 있도록 클라이언트가 사용하는 서비스 구현을 리팩터링하십시오. 뱅 우린 끝났어 융통성이 없습니다. 복잡하지 않습니다.
2) 구현을 리팩토링하여 작업을 팩토리를 통해 얻은 또 다른 종속성에 위임하십시오. 이제 팩토리를 리팩토링하여 모든 구현을 제어 할 수 있습니다.
3) 구현을 리팩터링하여 서비스 로케이터를 통해 얻은 또 다른 종속성에 작업을 위임하십시오. 이제 hashmap
약간의 캐스팅이 진행되는 객체에 대한 문자열 일 수있는 서비스 로케이터를 구성하여 모두가 사용하는 구현을 제어 할 수 있습니다 .
4) 아직 생각조차 못했던 것.
목표:
무의미한 복잡성을 추가하지 않고 이전에 잘못 설계 한 기존 클라이언트 코드를 미래로 드래그하여 발생하는 설계 손상을 최소화합니다.
고객은 의존성 구현을 알거나 제어해서는 안되지만로 구현해야한다고 주장합니다 new
. 우리는 통제 할 수 없지만 new
그들이 만들고있는 수업은 통제합니다.
내 질문:
내가 무엇을 고려하지 못했습니다?
다른 구현간에 구성 할 가능성이 정말로 필요합니까? 무슨 목적을 위해?
민첩. 미지의 많은. 경영진은 변화의 잠재력을 원합니다. 외부 세계에 대한 의존성 만 잃습니다. 또한 테스트.
다른 구현 간을 전환하려면 런타임 역학이 필요하거나 컴파일 타임 역학이 필요합니까? 왜?
컴파일 타임 메카닉이면 충분합니다. 테스트 제외.
구현간에 전환해야하는 세분성 한 번에? 모듈 당 (각 클래스 그룹을 포함)? 수업 당?
1001 중에서 한 번에 하나만 시스템을 통해 실행됩니다. 모든 클라이언트가 한 번에 사용하는 것을 변경하는 것이 좋습니다. 의존성을 개별적으로 제어하는 것이 중요 할 수 있습니다.
누가 스위치를 제어해야합니까? 귀하 / 개발자 팀만? 관리자? 각 고객은 스스로? 아니면 클라이언트 코드의 유지 관리 개발자? 그렇다면 정비공은 얼마나 쉽고 견고하며 완전해야합니까?
테스트를위한 개발 외부 하드웨어 종속성으로서의 관리자가 변경됩니다. 테스트 및 구성이 쉬워야합니다.
우리의 목표는 시스템을 빠르고 현대화 할 수 있음을 보여주는 것입니다.
구현 스위치의 실제 사용 사례?
하나는, 하드웨어 솔루션이 준비 될 때까지 일부 데이터는 소프트웨어에 의해 제공 될 것입니다.