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();
}
}
上記のコードでは、2つの異なるHouseクラスの定義を確認できます。どちらにもgetTemp()関数があり、最初はデメテルの法則に違反しますが、2番目の関数はそれを保持します(Head First Design Patternsの本による)。
問題は、2番目のクラスがデメテルの法則を保持している理由がよくわからないことです。getTemp()関数にはまだstation.getThermometer()呼び出しがあり、これはデメテルの法則に違反しています。「ドットを1つだけ使用する」-ウィキペディアでこれを見つけましたが、これは当てはまる可能性がありますが、さらに詳細な説明が必要です-「特に、オブジェクトは別のメソッドによって返されるメンバーオブジェクトのメソッドを呼び出さないようにする必要があります」(wiki)。
では、2番目のコード例が法律に違反しない理由を誰かが説明できますか?2番目の方法と最初の方法を本当に区別するものは何ですか?