假設下課時德米特檢驗的IntelliJ Idea法則。假陽性還是不假?
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();
}
}
的Intelli-J是告訴我,我犯法德米特因爲DoSomethingToThing使用函數的結果,據說你只能調用字段,參數或方法對象本身。
難道我真的有做這樣的事情:
public class Test {
//Previous methods
...
private void doSomething(Thing thing) {
thing.doSomething();
}
private void doSomethingToThing(int index) {
doSomething(getThing(index));
}
}
我覺得這很麻煩。我認爲德米特的法則是這樣,一個班級不知道另一個班級的內部,但getThing()
是同一班!
這是否真的違反了德米特法?這真的是改進設計嗎?
謝謝。
你的意思是什麼東西暴露方法,做的東西呢?因爲Thing公開了'doSomething()'。除此之外它似乎你建議我必須添加額外的方法。對? – superjugy
對不起,修正了。我建議直接操作,和/或重載,所以它看起來更整齊。 –
那麼這裏的東西是Thing是一個真正的接口,getThing實例化真實的類。但是Thing只能在私人測試中使用。我會更新試圖反映這一點的問題。 – superjugy