Когда дублирование лучше неправильной абстракции: подходы AHA и WET?
Смежные принципы проектирования
Неправильная абстракция дороже дублирования: копию легко поменять локально, а неудачно обобщённый код обрастает флагами и связывает несвязанные сценарии.
Термины
- WET — «Write Everything Twice»: не абстрагируй, пока похожее не написано хотя бы дважды; ироничная противоположность DRY.
- AHA — «Avoid Hasty Abstractions» (Кент Си Доддс): терпи повтор, пока не станет ясно, что именно общее.
- Сэнди Метц, «The Wrong Abstraction» (2016): «duplication is far cheaper than the wrong abstraction».
Как абстракция деградирует
- Два похожих места вынесли в
formatPrice(). - Новый кейс чуть отличается — появился параметр
isWholesale. - Потом
options.hideCurrency,options.legacy. - Функция на 80 строк, каждый вызов использует свой кусок, правка для одного ломает другого.
Рецепт Метц: заинлайнить абстракцию обратно во все места вызова, выкинуть в каждом неиспользуемые ветки и заново посмотреть, что общее.
Когда дублирование — зло
- Бизнес-правило, которое обязано меняться синхронно: лимиты, формулы налога.
- Проверки безопасности: забытая копия — уязвимость.
- Скопированный баг: починили в одном месте, в двух других остался.
Эвристика
Совпадение кода ≠ совпадение причин изменения. Если копии меняются по разным причинам, это разные знания, и их объединение нарушает SRP.
Коротко для собеседования
Копию исправить легче, чем распутать абстракцию, объединившую сценарии с разными причинами изменений. Тревожный признак — флаги, отключающие половину логики: тогда абстракцию инлайнят обратно и обобщают заново; но бизнес-правила и проверки безопасности всё равно не дублируют.