Два метода расчёта скидки — для розницы и для опта — сегодня содержат идентичный код, но правила задают разные владельцы и они уже расходились в прошлом. Что правильнее сделать?
Оставить дублирование: совпал код, но не знание. Правила меняются по разным причинам и разными владельцами — объединение создаст управляющую связанность: первое расхождение даст boolean-флаг, второе — ещё один.
- Критерий объединения: изменятся ли вместе и по одной причине
- Правило трёх: обобщать после третьего повторения
- Неверная абстракция дороже дублирования (Сэнди Метц)
А ещё Связь с SRP: одна причина изменения
Подробно
Это случайное (совпадающее) дублирование. Критерий объединения — «изменятся ли вместе и по одной причине», а не «выглядят ли одинаково». Объединение здесь создаст управляющую связанность: первое расхождение породит boolean-флаг, второе — ещё один, и метод превратится в развилку. Правило трёх и принцип «дублирование дешевле неправильной абстракции» — про это же.
Что хотят услышать
- Случайное и настоящее дублирование.
- Критерий объединения.
Частые ошибки
- Применять DRY механически по внешнему сходству кода.
- Разводить случаи boolean-параметром — это управляющая связанность и признак того, что абстракция выбрана неверно.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Немедленно вынести общий метод: по DRY дублирование недопустимо в любом случае
- ✗Вынести общий метод с boolean-параметром, различающим два случая
- ✗Вынести общий метод в базовый класс и наследоваться от него в подклассах
- ✓Оставить дублирование: совпадение случайное, правила независимы
Что спросят дальше
- Как понять, что абстракция всё-таки назрела?
- Чем управляющая связанность хуже связанности по данным?
Разбор темы
- DRY, KISS, YAGNI и качество связей
Дублирование знания против дублирования текста, цена преждевременной абстракции, связность и связанность, закон Деметры, каталог code smells и когда рефакторить.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.