Я видел эту ошибку много раз, и я сделал ее сам. Когда вы впервые читаете о концепции сухого программирования, вы, вероятно, неправильно поняли ее.
То, что происходит в вашей голове, было следующим:
Википедия: сухой подставка для того, чтобы не повторять один и тот же код дважды. Вы: Хм, хорошо, я заменю все свои дублиции абстракцией.
И это кажется хорошим решением, но это не так. Ваша абстракция часто неверна.
Вот почему:
- Вы видите дублирование.
- Вы извлекаете дублирование в новую абстракцию (метод, класс).
- Вы заменяете дублирование новой абстракцией.
- Вы думаете, что ваш код идеален.
- Время проходит.
- У менеджера продукта есть новые требования. Ваша абстракция почти идеальна для них.
- Вы начинаете реализовать новые требования.
- И вот маленькая Но: ваша абстракция почти идеальна. Почему? Новые требования затрагивают только 95% старого кода, который вы извлекли в абстракцию. Остальные 5% не затронуты. И вместо того, чтобы создать новую абстракцию с 95% копированным кодом из текущего, вы решили изменить код вашей абстракции. Вы добавляете условное утверждение,
if..else
Например, и передайте параметр, чтобы ваша абстракция могла выполнять разные действия для разных решений. - Теперь ваша абстракция ведет себя по -разному в разных случаях.
- Приходит еще одно новое требование. Другой дополнительный параметр. Еще один новый условный. (Цикл, пока код не станет очень трудным для понимания и поддержания.)
- Поздравляю, вы создали неправильную абстракцию.
Код больше не представляет единую общую абстракцию. Это становится насыщенной условием процедуры. Трудно понять и легко сломать. Добавление новых функций невероятно сложно, и каждая новая функция усложняет код еще больше.
Это бесконечная петля.
Так что делать?
Напишите все дважды.
Мокрый (пишите все дважды) – противоположная концепция, чтобы высохнуть. Когда вы начинаете разрабатывать новую систему, вы не знаете все будущие требования. Так что не спешите в абстракции.
Вы должны помнить: дублирование намного дешевле, чем неправильная абстракция.
Например, вы создаете веб -приложение и сейчас не имеете дизайна пользовательского интерфейса для всех страниц. Но у вас также есть много кнопок, и они похожи на каждой странице. Вы решите переместить их в компонент под названием Кнопка
и повторно используйте его на каждой странице. Кажется логичным.
“Эй, эй!” Новый дизайн страницы поступил от менеджера продукта. Вы смотрите на это и находите новую, причудливую кнопку внизу страницы.
Это похоже на старые кнопки, но у него есть «одна маленькая вещь». Чтобы реализовать его, вам нужно переписать 10% вашего Кнопка
компонент и добавьте условные операторы и новые параметры.
Теперь у вас есть дилемма:
- Изменение
Кнопка
Анкет Перепишите 10% кода абстракции (добавьте логические условия для поддержки новой логики причудливой кнопки). - Создайте две абстракции:
Fancybutton
иКнопка
Анкет Скопируйте 90% кода изКнопка
кFancybutton
Анкет
Я знаю, что вы хотите выбрать первый вариант. Вы думаете, что можете справиться с этим. Вы не собираетесь создавать неправильную абстракцию.
Но печальная правда в том, что вы будете (за исключением случаев, когда вы опытный программист и знаете, что делаете).
Скопируйте этот код. Не бойтесь.
Через некоторое время вы узнаете, как будут выглядеть ваши кнопки в будущем. Затем вы можете проанализировать текущую кодовую базу, найти дублированный код в компонентах кнопки и переместить их в хорошую абстракцию.
Если вы обнаружите, что уже слишком поздно справляться с неправильной абстракцией, самый быстрый способ двигаться вперед – вернуться.
Сделайте следующее:
- Переместите абстрактный код обратно.
- Удалить неиспользованный параметр, который передается абстракции, чтобы выполнить разные действия для разных решений.
- Удалить неиспользованную логику.
Это удаляет абстракцию и условные операторы для каждого вызывающего абонента.
Если вы обнаружите, что проходите параметры и добавляете условные операторы через общий код, ваша абстракция неверна.
Предпочитаю дублирование из -за неправильной абстракции.
🔴 Если вам нравится эта статья, поделитесь ею с друзьями и Подпишись на меня в Твиттере
🔴 Получите больше советов по кодированию, советы по собеседованию и последних технических новостей 👉 Присоединяйтесь к моей бюллетене
Оригинал: “https://dev.to/nickbulljs/when-dry-doesn-t-work-go-wet-4536”