는IntelliJ Idea의 Demeter 검사 법칙. 거짓 긍정인가요?
interface Thing {
void doSomething();
}
public class Test {
public void doWork() {
//Do smart things here
...
doSomethingToThing(index);
// calls to doSomethingToThing might happen in various places across the class.
}
private Thing getThing(int index) {
//find the correct thing
...
return new ThingImpl();
}
private void doSomethingToThing(int index) {
getThing(index).doSomething();
}
}
인텔리 J가 나는 함수의 결과를 사용 DoSomethingToThing 때문에 데메테르의 법을 위반하고있어 가정에만 필드, 매개 변수 또는의 메소드를 호출 할 수 있음을 말해되는 다음 클래스를 가정 개체 자체.
은 정말 이런 식으로 뭔가를해야합니까 :
public class Test {
//Previous methods
...
private void doSomething(Thing thing) {
thing.doSomething();
}
private void doSomethingToThing(int index) {
doSomething(getThing(index));
}
}
나는 귀찮은 것을 찾을 수 있습니다. 데메테르의 법칙은 한 클래스가 다른 클래스의 내부를 알지 못하도록하기 위해서라고 생각하지만, getThing()
은 같은 클래스입니다!
이것은 정말 demeter의 법칙을 어긴 것입니까? 이게 정말 개선되는 디자인인가요?
감사합니다.
Thing이 그걸 처리하는 방법을 폭로한다는 것은 무엇을 의미합니까? Thing이'doSomething()'을 노출하고 있기 때문입니다. 그 외에는 추가 방법을 추가해야한다고 제안하는 것 같습니다. 권리? – superjugy
죄송합니다. 직접 조작 및/또는 오버로딩을 제안하므로 더 깔끔하게 보입니다. –
여기에있는 것은 실제로 Thing이 실제로 인터페이스이고 getThing이 실제 클래스를 인스턴스화한다는 것입니다. 그러나 사물은 시험 안에서만 사적으로 사용됩니다. 나는 그것을 반영하려고하는 질문을 업데이트 할 것이다. – superjugy