문제

그만큼 데메테르의 법칙 직접 알고있는 개체에 대해서만 말해야한다는 것을 나타냅니다. 즉, 다른 물체와 대화하기 위해 방법 체인을 수행하지 마십시오. 그렇게 할 때, 당신은 중간 물체와 부적절한 연계를 설정하고 부적절하게 커플 링 다른 코드에 대한 코드.

그 나쁜.

이 솔루션은 당신이 알고있는 클래스를위한 것입니다.

좋아요.

그러나 그것은 클래스가 낮은 것으로 보입니다. 응집력. 더 이상 그것은 단순히 그것이하는 일에 대한 책임이 없지만, 어떤 의미에서는 대의원들을 가지고있어서 관련 객체의 인터페이스의 일부를 복제하여 코드를 덜 응집력있게 만듭니다.

그 나쁜.

실제로 응집력을 낮추는가? 두 가지 악의 적은 일입니까?

이것은 회색 개발 영역 중 하나입니까? 라인이 어디에 있는지 토론 할 수 있습니까?

도움이 되었습니까?

해결책

"객체 지향 분석 및 디자인"의 Grady Booch :

"응집력의 아이디어는 구조화 된 설계에서 비롯됩니다. 간단히 말하면, 응집력은 단일 모듈의 요소들 사이의 연결 정도를 측정합니다 (객체 지향 설계, 단일 클래스 또는 객체). 가장 바람직한 형태의 응집력은 우연의 일치입니다. 전적으로 관련이없는 추상화가 동일한 클래스 또는 모듈에 던져지는 응집력. 예를 들어, 개와 우주선의 추상화를 포함하는 클래스를 고려하여 행동이 상당히 관련이 없습니다. 가장 바람직한 형태의 응집력은 기능적 응집력입니다. 클래스 나 모듈의 모든 것이 잘 어울리는 행동을 제공하기 위해 함께 작동합니다. 따라서, 계급 개는 개가 개, 개 전체, 개 외에는 아무것도 아닌 행동을 받아들이면 기능적으로 응집력이 있습니다. "

위의 고객과 함께 개를 삭감하면 조금 더 명확 할 수 있습니다. 따라서 목표는 실제로 기능적 응집력을 목표로하고 가능한 한 우연의 일치 응집력에서 벗어나는 것입니다. 추상화에 따라 간단하거나 리팩토링이 필요할 수 있습니다.

참고 응집력은 단일 클래스, 즉 함께 작동하는 클래스 그룹보다 "모듈"에 적용됩니다. 따라서이 경우 고객 및 주문 클래스는이 강력한 관계가 있기 때문에 여전히 적절한 응집력을 가지고 있습니다. 고객은 주문을 생성하고 주문은 고객에게 속합니다.

Martin Fowler는 "Demeter의 제안"이라고 부르는 것이 더 편안 할 것이라고 말합니다 (기사 참조 모의는 스터브가 아닙니다):

"Mockist Testers는 'Train Wrecks'를 피하는 것에 대해 더 많이 이야기합니다 - GetThis (). getTheOther ()의 방법 체인 체인. 전달 방법으로 부풀어진 중간 남성 물체의 반대 문제는 또한 냄새입니다. 데메테르의 제안 .)"

그것은 내가 어디에서 왔는지 잘 요약합니다. 그것은 "법"에 대한 엄격한 준수가 필요할 수있는 것보다 완벽하게 수용 가능하며 종종 응집력이 낮습니다. 우연의 응집력을 피하고 기능적 응집력을 목표로하지만 설계 추상화와 더 자연스럽게 맞는 데 필요한 곳에 조정하지 마십시오.

다른 팁

당신이

int price = customer.getOrder().getPrice();

솔루션은 getOrderPrice ()를 작성하고 코드를

int price = customer.getOrderPrice();

그러나 대신에 이것은 a입니다 코드 냄새 그리고 희망적으로 응집력과 더 낮은 커플 링을 증가시키는 관련 변경 사항을 만듭니다. 불행히도 여기에는 항상 적용되는 간단한 리팩토링이 없지만 아마도 신청해야합니다. 묻지 말라고 말하십시오

응집력이 무엇을 의미하는지 오해했을 수도 있다고 생각합니다. 다른 여러 클래스의 관점에서 구현되는 클래스는 명확한 개념을 나타내고 명확한 목적을 가진 한 반드시 응집력이 낮은 것은 아닙니다. 예를 들어, 당신은 가질 수 있습니다 class Person, 클래스 측면에서 구현됩니다 Date (생년월일), Address, 그리고 Education (그 사람이 갔던 학교 목록). 포장지를 제공 할 수 있습니다 Person 출생의 해, 마지막 학교 또는 그가 사는 곳 또는 주에서는 사실을 드러내지 않기 위해 Person 다른 클래스 측면에서 구현됩니다. 이것은 커플 링이 줄어들지 만 만들어 질 것입니다 Person 덜 응집력이 없습니다.

회색 영역입니다. 이 교장들은 당신이 당신의 일에 당신을 돕기위한 것입니다. 당신이 그들을 위해 일하고 있다면 (즉, 당신의 길을 가고 있거나, 당신은 그것을 당신의 코드를 복잡하게 생각하고 있습니다), 당신은 너무 열심히 일치하고 필요합니다. 물러서.

당신을 위해 일하게 만들고, 그것을 위해 일하지 마십시오.

이것이 실제로 응집력을 낮추는 지 모르겠습니다.

집계/구성은 모두 공개 방법을 통해 노출되는 계약을 충족시키기 위해 다른 클래스를 사용하는 클래스에 관한 것입니다. 클래스는 관련 객체의 인터페이스를 복제 할 필요가 없습니다. 실제로 메소드 호출자의 집계 된 클래스에 대한 knwowledge를 숨기고 있습니다.

여러 수준의 클래스 종속성의 경우 Demeter의 법칙을 준수하려면 각 수준에서 집계/구성 및 양호한 캡슐화를 적용하면됩니다.

다시 말해, 각 클래스는 다른 클래스에 대해 하나 이상의 종속성을 가지고 있지만, 이는 참조 클래스에 대한 종속성 일 뿐이며 적절한/방법에서 반환 된 객체는 아닙니다.

커플 링과 응집력 사이에 트레이드 오프가있는 것처럼 보이는 상황에서, 아마도 다른 사람이 이미이 논리를 작성했고, 버그를 찾고 있었는데, 어디에서 먼저 볼 것인가? " 코드를 그런 식으로 작성하십시오.

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