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

Два метода расчёта скидки — для розницы и для опта — сегодня содержат идентичный код, но правила задают разные владельцы и они уже расходились в прошлом. Что правильнее сделать?

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

Оставить дублирование: совпал код, но не знание. Правила меняются по разным причинам и разными владельцами — объединение создаст управляющую связанность: первое расхождение даст boolean-флаг, второе — ещё один.

  • Критерий объединения: изменятся ли вместе и по одной причине
  • Правило трёх: обобщать после третьего повторения
  • Неверная абстракция дороже дублирования (Сэнди Метц)

А ещё Связь с SRP: одна причина изменения

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

Подробно

Это случайное (совпадающее) дублирование. Критерий объединения — «изменятся ли вместе и по одной причине», а не «выглядят ли одинаково». Объединение здесь создаст управляющую связанность: первое расхождение породит boolean-флаг, второе — ещё один, и метод превратится в развилку. Правило трёх и принцип «дублирование дешевле неправильной абстракции» — про это же.

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

  • Случайное и настоящее дублирование.
  • Критерий объединения.

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

  • Применять DRY механически по внешнему сходству кода.
  • Разводить случаи boolean-параметром — это управляющая связанность и признак того, что абстракция выбрана неверно.

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

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

Показать варианты и ответ
  • ✓Оставить дублирование: это случайное совпадение, а объединение свяжет два независимых правила
  • ✗Немедленно вынести общий метод — дублирование недопустимо по DRY
  • ✗Вынести общий метод с boolean-параметром, различающим случаи
  • ✗Вынести общий метод и наследоваться от него в двух подклассах

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

  • Как понять, что абстракция всё-таки назрела?
  • Чем управляющая связанность хуже связанности по данным?

Разбор темы

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

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

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

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

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