나는 실용 주의자이지만, 여기서 나의 주요 관심사는 ConfigBlock
인터페이스 디자인이 나쁜 방식으로 지배 할 수 있다는 것입니다. 다음과 같은 것이있을 때 :
explicit MyGreatClass(const ConfigBlock& config);
...보다 적절한 인터페이스는 다음과 같습니다.
MyGreatClass(int foo, float bar, const string& baz);
...이 foo/bar/baz
분야에서 체리를 따는 것과는 반대로 ConfigBlock
.
게으른 인터페이스 디자인
더하기 측면에서 디자인의이 종류는 새로운 무언가를 필요로 끝날 경우, 당신은 단지에 그것을로드 할 수 있기 때문에 쉽게, 예를 들면 생성자, 안정된 인터페이스를 디자인 할 수 있습니다 ConfigBlock
(아마도 코드를 변경하지 않고) 다음 cherry- 인터페이스를 변경하지 않고 필요한 새로운 것을 선택하십시오. 구현 구현 만 변경하십시오 MyGreatClass
.
따라서 실제로 필요한 입력 만 받아들이는보다 신중하게 생각할 수있는 인터페이스를 설계 할 수있는 장점이 있습니다. "정확한 매개 변수는이 인터페이스가 작동 하는 데 필요한 것" 과는 반대로 "이 방대한 양의 데이터를 제공하고 필요한 데이터를 선택하겠습니다" 라는 사고 방식을 적용합니다 .
따라서 여기에는 분명히 몇 가지 장점이 있지만 단점으로 인해 훨씬 더 중요 할 수 있습니다.
커플 링
이 시나리오에서 ConfigBlock
인스턴스 에서 생성되는 모든 클래스는 종속성이 다음과 같이 표시됩니다.
예를 들어이 Class2
다이어그램에서 단위 테스트 를 개별적으로 수행하려는 경우 PITA가 될 수 있습니다 . 다양한 조건에서 테스트 할 수 있도록 ConfigBlock
관련 필드 Class2
가 포함 된 다양한 입력 을 표면적으로 시뮬레이션해야 할 수도 있습니다 .
모든 종류의 새로운 맥락에서 (단위 테스트 또는 완전히 새로운 프로젝트이든), 그러한 클래스는 우리가 항상 ConfigBlock
타기를 위해 가져 와서 설정해야하므로 결국 재사용에 대한 부담이 더 커질 수 있습니다. 따라서.
재사용 성 / 배포성 / 시험 성
대신 이러한 인터페이스를 적절하게 디자인하면 다음과 같은 인터페이스를 분리 할 수 있습니다 ConfigBlock
.
이 다이어그램에서 알 수 있듯이 모든 클래스는 독립적이됩니다 (구심 / 발신 커플 링은 1 씩 줄어 듭니다).
이로 인해 ConfigBlock
새로운 시나리오 / 프로젝트에서 (재) 사용 / 테스트가 훨씬 쉬워 질 수 있는 훨씬 더 독립적 인 클래스 (적어도 독립적 )가 생깁니다 .
이제이 Client
코드는 모든 것에 의존하고 함께 모아야하는 코드가됩니다. 부담은이 클라이언트 코드로 전송되어 a에서 적절한 필드를 읽고 ConfigBlock
이를 매개 변수로 적절한 클래스에 전달합니다. 그러나 이러한 클라이언트 코드는 일반적으로 특정 상황에 맞게 좁게 설계되었으며 재사용 가능성은 일반적으로 어지럽거나 닫힙니다 (응용 프로그램의 main
진입 점 기능 또는 이와 유사한 것일 수 있음).
따라서 재사용 성과 테스트 관점에서 이러한 클래스를보다 독립적으로 만드는 데 도움이 될 수 있습니다. 클래스를 사용하는 사람들을위한 인터페이스 관점에서 ConfigBlock
모든 것에 필요한 전체 데이터 필드 세계를 모델링하는 하나의 방대한 매개 변수 대신 필요한 매개 변수를 명시 적으로 설명하는 데 도움이 될 수 있습니다 .
결론
일반적으로, 필요한 모든 것을 갖는 단일체에 의존하는 이러한 종류의 클래스 지향 디자인은 이러한 종류의 특성을 갖는 경향이있다. 결과적으로 적용 가능성, 배포 가능성, 재사용 가능성, 테스트 가능성 등이 크게 저하 될 수 있습니다. 그러나 긍정적 인 스핀을 시도하면 인터페이스 디자인을 단순화 할 수 있습니다. 이러한 장단점을 측정하고 타협점의 가치가 있는지 결정하는 것은 귀하의 몫입니다. 일반적으로 더 일반적이고 널리 적용되는 디자인을 모델링하려는 클래스의 모놀리스에서 체리 피킹하는 경우 이러한 종류의 디자인에 대해 실수하는 것이 훨씬 안전합니다.
마지막으로 :
extern CodingBlock MyCodingBlock;
...이 클래스는 클래스뿐만 아니라 클래스 ConfigBlocks
의 특정 인스턴스 에 직접 연결되기 때문에 종속성 주입 방식보다 위에서 설명한 특성면에서 훨씬 더 나빠질 수 있습니다. 이는 적용 가능성 / 배포 가능성 / 테스트 가능성을 더욱 떨어 뜨립니다.
필자의 일반적인 조언은 적어도 당신이 디자인하는 가장 일반적으로 적용 가능한 클래스에 대한 매개 변수를 제공하기 위해 이러한 종류의 모 놀리 식에 의존하지 않는 인터페이스 디자인 측면에서 실수하는 것입니다. 피할 수없는 매우 강력하고 자신감있는 이유가 없다면 가능하지 않으면 의존성 주입없이 전역적인 접근 방식을 피하십시오.