(первоначально отправлено в информационный бюллетень :BaseClass)
Почему это должно меня беспокоить?
Принцип «СУХОЙ» или «Не повторяйся» является одним из наиболее часто цитируемых, но чаще всего неправильно понимаемых принципов программирования.
Хотя предпосылка проста, она может привести к чрезмерной абстракции и сложности сопровождения кода при неправильной интерпретации.
Не повторяйтесь
Принцип DRY был представлен в книге The Pragmatic Programmer в 1999 году.
Оригинальное определение:
Каждая часть знаний должна иметь единственное, недвусмысленное, авторитетное представление в системе.
Так что это значит?
Начнем с того, что это не означает…
Непонимание принципа DRY
DRY обычно используется как аргумент против написания одной и той же строки кода дважды.
Это понятно. Если нам нужно скопировать/вставить какой-то код, который мы уже использовали, мы сразу же хотим перенести его в общую абстракцию — это в нашей природе программистов!
Но написание одной и той же строки кода дважды не обязательно плохо, и не это то, о чем говорит DRY.
Вот что сказал в подкаст-интервью один из авторов книги, придумавшей этот термин — Дэйв Томас:
DRY стало означать "Не копировать и не вставлять", но исходное "Не повторяйся" не имело ничего общего с кодом, это было связано со знаниями.
Опасности чрезмерной абстракции
Есть несколько веских причин писать один и тот же блок кода дважды; код может делать то же самое, но по разным причинам или в разных контекстах.
В следующий раз, когда у вас возникнет соблазн абстрагироваться от двух похожих областей, спросите себя:
Есть ли у этих разделов кода другие причины для изменения в будущем?
Если это так, абстракция может быть неправильным выбором.
После того как вы абстрагировали этот код, вы не можете изменить одну область, не затронув другую — теперь они связаны.
Возможно, это правильное решение, и вы все равно можете абстрагировать их, но DRY не настаивает на этом.
DRY — это «знание»
Суть DRY заключается в том, чтобы любое изменение функциональности вашего кода происходило только в одном месте.
Мы все работали над кодом, в котором простое функциональное изменение требует слишком много изменений кода.
Если я хочу изменить способ форматирования имени пользователя, я должен изменить его на странице профиля, в электронных письмах с подтверждением, в генераторе счетов, на панели управления… ну вы поняли.
Об этом предупреждает DRY; должно быть одно место, чтобы сделать это изменение. Знания о том, как форматировать имя пользователя, должны содержаться только в одной области вашего кода.
В следующий раз, когда мне нужно будет внести это изменение, я точно знаю, куда идти. В противном случае это только вопрос времени, когда я забуду одну из многих областей, которые мне нужно изменить, и вызову ошибку.
Хотите знать больше?
Проверьте эти ссылки:
- Книга «Программист-прагматик. Обязательна к прочтению для разработчиков!»
- Короткий пост в блоге, в котором обсуждается, почему DRY неправильно понимают
- Выпуск подкаста с авторами оригинальной книги