Какой из фрагментов нарушает закон Деметры?
Нарушение — путешествие по графу чужих объектов: order.getCustomer().getAddress().getCity().getName() фиксирует в вызывающем коде всю структуру, и любое изменение по пути его ломает. Число точек само по себе не критерий.
- Можно обращаться к своим полям, параметрам и созданным объектам
- Лечение — «Tell, don't ask»: order.deliveryCity()
- Fluent API и стримы закон не нарушают — каждый вызов возвращает тот же уровень абстракции
А ещё DTO и записи данных — тоже не нарушение: структура и есть их контракт
Подробно
Закон Деметры разрешает обращаться к полям своего объекта, своим параметрам и созданным объектам, но не к структуре чужих. Цепочка getCustomer().getAddress().getCity() фиксирует в вызывающем коде весь граф: любое изменение по пути его ломает. Лечение — «Tell, don't ask»: order.deliveryCity(). Fluent-цепочки и стримы нарушением не являются — каждый вызов возвращает тот же объект или ту же абстракцию.
Что хотят услышать
- Суть закона.
- Различие с fluent-цепочками.
Частые ошибки
- Объявлять нарушением любую цепочку вызовов, включая билдеры и стримы.
- Заменять цепочку геттеров на такую же цепочку внутри другого класса, не перенося поведение.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗String s = new StringBuilder().append("a").append("b").append("c").toString();
- ✓String city = order.getCustomer().getAddress().getCity().getName();
- ✗List<String> names = users.stream().map(User::name).toList();
- ✗repository.save(order);
Что спросят дальше
- Что такое «Tell, don't ask» и как он связан с инкапсуляцией?
- Как закон Деметры проявляется в тестах?
Разбор темы
- DRY, KISS, YAGNI и качество связей
Дублирование знания против дублирования текста, цена преждевременной абстракции, связность и связанность, закон Деметры, каталог code smells и когда рефакторить.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.