(первоначально отправлено в информационный бюллетень :BaseClass)

Почему это должно меня беспокоить?

Принцип «СУХОЙ» или «Не повторяйся» является одним из наиболее часто цитируемых, но чаще всего неправильно понимаемых принципов программирования.

Хотя предпосылка проста, она может привести к чрезмерной абстракции и сложности сопровождения кода при неправильной интерпретации.

Не повторяйтесь

Принцип DRY был представлен в книге The Pragmatic Programmer в 1999 году.

Оригинальное определение:

Каждая часть знаний должна иметь единственное, недвусмысленное, авторитетное представление в системе.

Так что это значит?

Начнем с того, что это не означает

Непонимание принципа DRY

DRY обычно используется как аргумент против написания одной и той же строки кода дважды.

Это понятно. Если нам нужно скопировать/вставить какой-то код, который мы уже использовали, мы сразу же хотим перенести его в общую абстракцию — это в нашей природе программистов!

Но написание одной и той же строки кода дважды не обязательно плохо, и не это то, о чем говорит DRY.

Вот что сказал в подкаст-интервью один из авторов книги, придумавшей этот термин — Дэйв Томас:

DRY стало означать "Не копировать и не вставлять", но исходное "Не повторяйся" не имело ничего общего с кодом, это было связано со знаниями.

Опасности чрезмерной абстракции

Есть несколько веских причин писать один и тот же блок кода дважды; код может делать то же самое, но по разным причинам или в разных контекстах.

В следующий раз, когда у вас возникнет соблазн абстрагироваться от двух похожих областей, спросите себя:

Есть ли у этих разделов кода другие причины для изменения в будущем?

Если это так, абстракция может быть неправильным выбором.

После того как вы абстрагировали этот код, вы не можете изменить одну область, не затронув другую — теперь они связаны.

Возможно, это правильное решение, и вы все равно можете абстрагировать их, но DRY не настаивает на этом.

DRY — это «знание»

Суть DRY заключается в том, чтобы любое изменение функциональности вашего кода происходило только в одном месте.

Мы все работали над кодом, в котором простое функциональное изменение требует слишком много изменений кода.

Если я хочу изменить способ форматирования имени пользователя, я должен изменить его на странице профиля, в электронных письмах с подтверждением, в генераторе счетов, на панели управления… ну вы поняли.

Об этом предупреждает DRY; должно быть одно место, чтобы сделать это изменение. Знания о том, как форматировать имя пользователя, должны содержаться только в одной области вашего кода.

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

Хотите знать больше?

Проверьте эти ссылки: