public House
{
WeatherStation station;
public float getTemp() {
//Law of Demeter has been violated here
return station.getThermometer().getTemperature();
}
}
public House
{
WeatherStation station;
public float getTemp() {
//Law of Demeter has been preserved?
Thermometer thermometer = station.getThermometer();
return getTempHelper(thermometer);
}
public float getTempHelper(Thermometer thermometer)
{
return thermometer.getTemperature();
}
}
在上面的代码中,您可以看到两个不同的 House 类定义。两者都有 getTemp() 函数,第一个违反了得墨忒耳定律,但第二个保留了它(根据 Head First Design Patterns book)。
问题是我不太明白为什么二等舱保留得墨忒耳定律,getTemp() 函数仍然有 station.getThermometer() 调用,这(应该?)违反了得墨忒耳定律。“只使用一个点” - 我在维基百科上找到了这个,它可能适用,但我仍然需要更详细的解释 - “特别是,一个对象应该避免调用由另一个方法返回的成员对象的方法”(wiki)。
那么谁能解释为什么第二个代码示例不违反法律?第二种方法与第一种方法的真正区别是什么?