Получить доступ

Какой из фрагментов нарушает закон Деметры?

MiddleПринципы проектирования
Коротко

Нарушение — путешествие по графу чужих объектов: order.getCustomer().getAddress().getCity().getName() фиксирует в вызывающем коде всю структуру, и любое изменение по пути его ломает. Число точек само по себе не критерий.

  • Можно обращаться к своим полям, параметрам и созданным объектам
  • Лечение — «Tell, don't ask»: order.deliveryCity()
  • Fluent API и стримы закон не нарушают — каждый вызов возвращает тот же уровень абстракции

А ещё DTO и записи данных — тоже не нарушение: структура и есть их контракт

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Закон Деметры разрешает обращаться к полям своего объекта, своим параметрам и созданным объектам, но не к структуре чужих. Цепочка getCustomer().getAddress().getCity() фиксирует в вызывающем коде весь граф: любое изменение по пути его ломает. Лечение — «Tell, don't ask»: order.deliveryCity(). Fluent-цепочки и стримы нарушением не являются — каждый вызов возвращает тот же объект или ту же абстракцию.

Что хотят услышать

  • Суть закона.
  • Различие с fluent-цепочками.

Частые ошибки

  • Объявлять нарушением любую цепочку вызовов, включая билдеры и стримы.
  • Заменять цепочку геттеров на такую же цепочку внутри другого класса, не перенося поведение.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓String city = order.getCustomer().getAddress().getCity().getName();
  • ✗String s = new StringBuilder().append("a").append("b").toString();
  • ✗List<String> names = users.stream().map(User::name).toList();
  • ✗repository.save(order);

Что спросят дальше

  • Что такое «Tell, don't ask» и как он связан с инкапсуляцией?
  • Как закон Деметры проявляется в тестах?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем