문제

따라서 각각 10 개의 객체가 1-3 개의 종속성을 가지고있을 수 있지만 (느슨한 커플 링에 관한 한 괜찮다고 생각합니다) 동작 (시간 초과, 창 크기 등)을 정의하는 데 사용할 수있는 일부 설정도 있습니다.

이제 제어 컨테이너의 역전을 시작하기 전에 공장을 만들었을 것입니다. 아마도 제작자의 크기를 권장 "4 이하"매개 변수로 유지하기 위해 1 개 이상의 설정이 필요한 각 객체에 대해 간단한 개체 세트 객체를 만들었을 것입니다. 크기. 나는 지금 컨트롤 컨테이너의 역전을 사용하고 있으며 그 정도의 포인트를 모두 보지 못했습니다. 물론 7 개의 매개 변수가있는 생성자를 얻을 수 있지만 누가 신경 쓰나요? 어쨌든 그것은 모두 IOC에 의해 채워지고 있습니다.

내가 여기서 뭔가를 놓치고 있습니까, 아니면 이것이 기본적으로 맞습니까?

도움이 되었습니까?

해결책

이 질문을 읽기 전에 클래스 복잡성과 IOC 생성자의 크기 사이의 관계는 나에게 발생하지 않았지만 아래의 분석은 IOC 생성자에 많은 논증이 코드 냄새 IOC를 사용할 때 알아야합니다. 짧은 생성자 인수 목록을 고수하는 목표를 달성하면 클래스 자체를 단순하게 유지하는 데 도움이됩니다. 다음 단일 책임 원칙 이 목표를 향해 안내해 줄 것입니다.

현재 Spring.net 프레임 워크를 사용하여 인스턴스화되는 122 개의 클래스가있는 시스템에서 작업합니다. 이 클래스 간의 모든 관계는 생성자에 설정됩니다. 물론,이 시스템은 몇 가지 규칙을 어겼던 완벽한 코드보다 적은 공유를 가지고 있습니다. (하지만, 우리의 실패는 배울 기회입니다!)

해당 클래스의 생성자는 다양한 수의 인수를 가지고 있으며, 아래 표에 표시됩니다.

Number of constructor arguments    Number of classes
           0                             57
           1                             19
           2                             25
           3                              9
           4                              3
           5                              1
           6                              3
           7                              2
           8                              2

인수 제로가있는 클래스는 구체적인 전략 클래스 또는 외부 시스템에 데이터를 전송하여 이벤트에 응답하는 클래스입니다.

5 개 또는 6 개의 논쟁을 가진 사람들은 모두 다소 부적절하며 일부 리팩토링을 사용하여 단순화 할 수 있습니다.

7 개 또는 8 개의 인수가있는 4 개의 클래스는 훌륭한 예입니다. 신의 대상. 그것들은 분해되어야하며, 각각은 이미 시스템 내에서 내 트러스트 스팟 목록에 있습니다.

나머지 클래스 (1 ~ 4 인수)는 (주로) 단순히 설계되고 이해하기 쉽고 단일 책임 원칙.

다른 팁

많은 의존성 (아마도 8 이상)의 필요성은 설계 결함을 나타낼 수 있지만 일반적으로 디자인이 응집력이있는 한 문제는 없다고 생각합니다.

또한 생성자 인수를 혼란스럽게하는 대신 로깅 및 인증과 같은 인프라 문제에 서비스 로케이터 또는 정적 게이트웨이를 사용하는 것을 고려하십시오.

편집 : 8은 아마 너무 많지만 이상한 사례가있을 것이라고 생각했습니다. Lee의 게시물을 본 후에는 1-4가 일반적으로 좋습니다.

G'day George,

우선, 객체 사이의 종속성은 무엇입니까?

많은 "ISA"관계? 많은 "hasa"관계?

많은 팬인? 아니면 팬 아웃?

George의 응답 : "Has-a는 대부분 상속 조언에 대한 구성을 따르려고 노력했습니다. 왜 그렇게 중요합니까?"

대부분 "Hasa"이므로 괜찮아야합니다.

메모리 누출을 방지하기 위해 구성 요소의 구성 (및 파괴)이 올바르게 수행되는지 확인하십시오.

그리고 이것이 C ++에있는 경우 가상 소멸자를 사용해야합니까?

이것은 힘든 것이며, 적절한 특성이 변이 가능하고 불변의 특성만이 유용한 기본값없이 필요한 종속성이 생성자의 일부인 하이브리드 접근법을 선호하는 이유. 일부 클래스는 필수 요소로 구성된 다음 세터를 통해 필요한 경우 조정됩니다.

그것은 모두 IOC를 수행하는 데 사용했던 컨테이너의 종류와 컨테이너가 주석을 사용하거나 구성 파일을 사용하여 객체를 구입 할 객체를 포화시키는 지 여부에 대한 접근에 달려 있습니다. 또한, 생성자 매개 변수가 단지 평범한 원시 데이터 유형이라면 실제로는 큰 문제가 아닙니다. 그러나 비-프리맨 유형이있는 경우 제 생각에는 고정 구조 기반 DI가 아닌 속성 기반 DI를 사용할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top