PassFront
  1. PassFront
  2. База знаний
  3. Смежные принципы проектирования

Когда дублирование лучше неправильной абстракции: подходы AHA и WET?

Смежные принципы проектирования

Неправильная абстракция дороже дублирования: копию легко поменять локально, а неудачно обобщённый код обрастает флагами и связывает несвязанные сценарии.

Термины

  • WET — «Write Everything Twice»: не абстрагируй, пока похожее не написано хотя бы дважды; ироничная противоположность DRY.
  • AHA — «Avoid Hasty Abstractions» (Кент Си Доддс): терпи повтор, пока не станет ясно, что именно общее.
  • Сэнди Метц, «The Wrong Abstraction» (2016): «duplication is far cheaper than the wrong abstraction».

Как абстракция деградирует

  1. Два похожих места вынесли в formatPrice().
  2. Новый кейс чуть отличается — появился параметр isWholesale.
  3. Потом options.hideCurrency, options.legacy.
  4. Функция на 80 строк, каждый вызов использует свой кусок, правка для одного ломает другого.

Рецепт Метц: заинлайнить абстракцию обратно во все места вызова, выкинуть в каждом неиспользуемые ветки и заново посмотреть, что общее.

Когда дублирование — зло

  • Бизнес-правило, которое обязано меняться синхронно: лимиты, формулы налога.
  • Проверки безопасности: забытая копия — уязвимость.
  • Скопированный баг: починили в одном месте, в двух других остался.

Эвристика

Совпадение кода ≠ совпадение причин изменения. Если копии меняются по разным причинам, это разные знания, и их объединение нарушает SRP.

Коротко для собеседования

Копию исправить легче, чем распутать абстракцию, объединившую сценарии с разными причинами изменений. Тревожный признак — флаги, отключающие половину логики: тогда абстракцию инлайнят обратно и обобщают заново; но бизнес-правила и проверки безопасности всё равно не дублируют.

Другие вопросы раздела