Моя WET кодовая база пытается

В течение многих лет мне говорили, что копипаста - это безусловное зло. Я избегал повторения кода даже дважды. Каждый раз, когда я видел нечто подобное, я создавал абстракцию, следуя принципу DRY. Иногда было так:

const title = `${hasConversion ? 'Convert and s' : 'S'}end`

Даже это трехбуквенное окончание не должно повторяться. Всегда.

В какой-то момент я заметил, что иногда после нескольких итераций таких рефакторингов простой на первый взгляд сервис становится очень сложным. Из ниоткуда начинает появляться множество уровней абстракций. И я испугался. Я понял, что мои основные знания, «лучшие практики» по сокращению повторяющегося кода - это то, что вы не должны применять, не задумываясь.

Тогда я сказал себе:
- Эй, может тебе стоит пересмотреть некоторые «сложные» логики, возникшие из-за СУХИХ причин, и сделать копипастинг? (пожалуйста, не говори моему менеджеру).

Вот код:

Да, я знаю ... Трудно понять, что здесь происходит на самом деле, с первого взгляда, потому что вы должны сначала понять все абстракции, которые возникли из-за сухости. Но как мы можем это улучшить? Обратим внимание на операторы if и проанализируем, как абстракция ведет себя в разных случаях.

В моем случае для 2/3 вызовов этой 20-строчной функции нужна только эта строка:

queryCache.invalidateQueries('users')

Эта точная строка создала абстракцию, потому что она использовалась три раза в одном файле. СУХОЙ!!! Но теперь из-за этой абстракции мне нужно прочитать 20 строк вместо одной, чтобы понять, что происходит в файле. Давайте проведем рефакторинг и встроенный getMutationOptions.

Вот что у нас получилось. Мы упростили функции и уменьшили связывание, убрали ненужный if-оператор.

Спасибо за чтение! Испытайте свои лучшие практики и ознакомьтесь с этой замечательной статьей Дэна Абрамова о принципе WET https://overrected.io/the-wet-codebase/