Нарушение Закона Деметры и возможное решение этой проблемы

Недавно я прочитал о Законе Деметры.

Предположим, у нас есть:

public class Restaurant {
     private String name;
     private Address address;

    // getters and setters...
}

public class Address {
     private String city;
     private String postalCode;

     // getters and setters...
}

Предположим, что где-то еще у меня есть:

public void myFoo(Restaurant restaurant) {
     ...
     String restaurantCity = restaurant.getAddress().getCity(); // Breaking Demetra?
     ...
}

Нарушаю ли я закон Деметры?

Я так думаю, потому что myFoo касается объекта (address), который не является атрибутом класса.

Мое решение состоит в том, чтобы изменить следующим образом:

public class Restaurant {
     private String name;
     private Address address;

     // getters and setters...

     // added
     public String getCity() {
          return this.getAddress().getCity();
     }
}

public void myFoo() {
     ...
     String restaurantCity = restaurant.getCity();
     ...
}

Это правильно?


person Community    schedule 05.09.2020    source источник
comment
Закон Деметры? В каком случае: да; и да.   -  person jonrsharpe    schedule 05.09.2020
comment
Извините, я не понял вашего комментария. Что ты имеешь в виду?   -  person    schedule 05.09.2020
comment
Я имею в виду, вы имеете в виду Закон Деметры? Это то, что вы, кажется, описываете, а я не знаком ни с одним Законом Деметры.   -  person jonrsharpe    schedule 05.09.2020
comment
Да, Закон Деметры   -  person    schedule 05.09.2020
comment
Людям было бы полезно ответить на вопрос, если бы вы быстро резюмировали Закон Деметры.   -  person NomadMaker    schedule 05.09.2020
comment
Использование restaurant.getAddress().getCity() может следовать Закону Деметры, в зависимости от того, как его интерпретировать. Есть несколько точек зрения.   -  person NomadMaker    schedule 05.09.2020