Закон Деметры рассчитывает сделать самую слабую связь между классами.
Это означает, что 90% всех геттеров/сеттеров, экспонирующих в классе, должны быть "удалены" и заменены методом "поведенческий". В самом деле, это соответствует философии "рассказать, не спрашивать", потому что клиент не должен относиться к самому поведению с помощью плохого метода getter/setter. Это уменьшает дублированный код, если одно и то же действие используется в другом месте.
Это подразумевает огромные классы со многими многими поведенческими методами и чрезмерное использование делегирования, если мы хотим уважать принцип единой ответственности.
С другой стороны, определение шаблона посетителя:
Посетитель позволяет вам определить новую операцию без изменения классов элементов, на которых она работает.
Итак, на первый взгляд, это кажется противоположным ожиданиям Закона Деметры:
-
Один (посетитель) подразумевает структуру класса, чтобы обеспечить getter/setter, чтобы Visitor мог изменять состояния объектов, не касаясь самого класса.
-
Другое (Деметра) поощряет заключать все поведенческие коды, непосредственно связанные с объектом в одном классе.
Итак, мой вопрос:
Когда мы можем считать, что класс закрыт для модификации и, таким образом, перестает добавлять к нему поведенческие методы и поэтому предпочитает добавлять их во вновь создаваемом посетителе с большим риском того, что клиент использует геттеры/сеттеры вместо методов поведения, которые уже были выставлены раньше в начальном классе?