데 메터의 법에 따르면, 클래스는 멤버 중 하나를 반환 할 수 있습니까?
예, 가장 확실합니다.
요점을 살펴 보자 .
- 각 장치는 다른 장치에 대한 정보가 제한적이어야합니다. 현재 장치와 "밀접하게"관련된 장치 만
- 각 부대는 친구들과 만 대화해야합니다. 낯선 사람과 이야기하지 마십시오.
- 가까운 친구와 만 대화하십시오.
이 세 가지 모두 하나의 질문을 남깁니다 . 친구는 누구입니까?
무엇을 반환할지 결정할 때, 데메테르의 법칙 또는 최소 지식 원칙 (LoD)은이를 위반할 것을 요구하는 코더를 방어 할 것을 요구하지 않습니다. 그것은 코더가 그것을 강요하지 않도록 지시합니다.
혼란스러워하는 것은 많은 사람들이 setter가 항상 void를 반환해야한다고 생각하는 이유입니다. 시스템 상태를 변경하지 않는 쿼리 (getter)를 작성하는 방법을 허용해야합니다. 기본 명령 쿼리 분리 입니다.
이것은 원하는대로 코드 체인을 자유롭게 탐색 할 수 있다는 것을 의미합니까? 아니요. 서로 연결되어있는 것만 함께 연결하십시오. 그렇지 않으면 체인이 바뀌고 갑자기 물건이 파손될 수 있습니다. 이것은 친구들이 의미하는 것입니다.
긴 체인을 설계 할 수 있습니다. 유창한 인터페이스, iDSL, 많은 Java8 및 오래된 Old StringBuilder는 모두 긴 체인을 구축 할 수있게합니다. 체인의 모든 것이 함께 작동하고 지속적으로 함께 일할 것이기 때문에 LoD를 위반하지 않습니다. 서로 들어 보지 못한 것들을 함께 묶을 때 데메테르를 위반하게됩니다. 친구는 체인을 계속 작동 시키겠다고 약속 한 사람들입니다. 친구의 친구는하지 않았다.
팩토리 및 빌더 클래스와 같이 객체를 반환하도록 특별히 지정된 클래스 외에도 클래스의 속성 중 하나에 의해 유지되는 객체 또는 데 메타 법칙을 위반하는 객체를 반환하는 방법은 괜찮습니다 (1) ?
이것은 데메테르를 위반할 수있는 기회를 만듭니다. 이것은 위반이 아닙니다. 이것은 반드시 나쁘지는 않습니다.
그리고 그것이 데 미터 법칙을 위반한다면, 반환 된 객체가 데이터를 나타내는 불변의 객체인지 여부와이 데이터에 대한 게터 만 포함하는 것이 중요합니까 (2)?
불변은 좋지만 여기서는 관련이 없습니다. 더 긴 체인을 통해 물건을 얻는 것이 더 나아지지는 않습니다. 더 나은 점은 사용하는 것과 분리하는 것입니다. 사용중인 경우 매개 변수로 필요한 것을 요청하십시오. 낯선 사람의 게터를 파헤쳐 서 사냥하지 마십시오.
의사 코드에서 :
데메테르의 법칙은 위와 같은 패턴을 금지한다고 생각합니다. 법을 위반하지 않고 doSomethingElse ()를 호출 할 수 있도록하려면 어떻게해야합니까 (3)?
내가 이야기하기 전에 x.doSomethingElse(a)
당신이 기본적으로 쓴 것을 이해하십시오
b.getA().doSomething()
이제 LoD는 도트 카운팅 연습이 아닙니다 . 그러나 체인을 만들 때 A
(를 사용하여 B
) 얻는 방법을 알고 있고를 사용하는 방법을 알고 있다고 말합니다 A
. 글쎄 지금 A
과 B
당신은 단지 그들을 함께 결합하기 때문에 더 가까운 친구가 될 수 있었다.
만약 당신이 무언가를 줄 것을 요청했다면 당신이 A
사용할 수 A
있고 그것이 어디에서 왔는지 걱정하지 않았을 것이고 B
, 행복하고 삶 A
에서 오는 것에 대한 집착이없는 삶을 살 수있을 것 B
입니다.
x.doSomethingElse(a)
어디에서 x
왔는지에 대한 세부 사항 이 없으면 LoD는 그것에 대해 전혀 말할 것이 없습니다.
LoD는 건설과의 사용을 분리 할 수 있습니다 . 그러나 종교적으로 모든 객체를 친숙하지 않은 것으로 취급하면 정적 메소드로 코드를 작성해야 할 것입니다. 이런 방식으로 놀랍도록 복잡한 객체 그래프를 만들 수 있지만 결국 작업을 시작하려면 메소드를 호출해야합니다. 친구가 누구인지 결정하기 만하면됩니다. 그로부터 멀어지지 않습니다.
따라서 클래스는 LoD 하의 멤버 중 하나를 반환 할 수 있습니다. 그렇지 않은 경우, 일부 클라이언트는 사용하기 전에 클래스를 가져 와서 해당 클래스에 연결하려고 시도 할 수 있기 때문에 해당 멤버가 클래스에 친숙한 지 명확히해야합니다. 반환하는 것이 항상 해당 사용을 지원해야하기 때문에 중요합니다.
이것이 단순히 우려되지 않는 많은 경우가 있습니다. 컬렉션은이를 사용하는 모든 것과 친구가되기 때문에이를 무시할 수 있습니다. 마찬가지로 가치있는 대상은 모든 사람에게 친숙합니다. 그러나 주소를 추출 해야하는 직원 객체를 요구하는 주소 유효성 검사 유틸리티를 작성한 경우 주소를 요청하기 만하면 직원과 주소가 모두 같은 라이브러리에서 온 것이기를 희망합니다.