Не повторяйтесь
(В оригинале - Don't Repeat Yourself)
Из всех принципов программирования «Не повторяйтесь» возможно один из самых фундаментальных. Принцип был сформулирован Энди Хантом и Дэйвом Томасом в книге «The Pragmatic Programmer» и лег в основу множества известных программистских практик и паттернов проектирования. Разработчик, умеющий находить повторения и понимающий как их избежать при помощи соответствующих практик или абстракций, может писать гораздо более аккуратный код по сравнению с тем, кто постоянно загрязняет приложение ненужными повторами.
Повторение – это потери
Каждая строчка кода, попавшая в производство, должна сопровождаться, и является возможным источником ошибок в будущем. Повторение раздувает код, давая больше возможностей для ошибок и внося дополнительное усложнение в систему. Раздутая система также затрудняет разработчикам понимание работы всей системы. К тому же становится сложно определить, что изменения в одной части достаточны, и не нужно их внести еще раз где-нибудь еще из-за повторения. «Не повторяйтесь» требует, чтобы правило «каждая часть знаний должна иметь единственное, недвусмысленное, официальное представление в системе» всегда соблюдалось.
Повторение процесса требует автоматизации
Множество процессов в разработке ПО повторяемы и легко автоматизируемы. Принцип «Не повторяйтесь» применяется здесь так же успешно, как и в исходном коде. Ручное тестирование медленно, ненадежно и сложно повторяемо, поэтому автоматизация тестирования должна применяться везде, где это возможно. Интеграция ПО может быть времязатратной и ненадежной, если делается вручную, поэтому процедура сборки должна выполняться как можно чаще, идеально при каждом помещении изменений. Там, где существует неприятный ручной процесс, который можно автоматизировать, то он должен быть автоматизирован. Цель – обеспечить, чтобы существовал единственный способ выполнить задачу, и этот способ должен быть как можно проще и легче.
Повторение логики требует абстракции
Повторение логики может принимать множество форм. Копи-паст, if-then, switch-case – вот самые простые способы определить проблемное место. Множество паттернов проектирования предназначены для уменьшения повторов в логике. Если объект требует выполнения нескольких действий перед использованием, это может быть решено при помощи Abstract Factory или Factory Method. Если объект имеет множетсво вариаций поведения, то это может быть реализовано паттерном Strategy вместо большой if-then структуры. Само описание паттернов проектирования – попытка снизить повторяемость усилий по решению часто встречающихся задач. Еще «Не повторяйтесь» может применяться к структурам данных (схемы баз данных), давая в результате нормализированную форму.
Основной принцип
Другие принципы разработки также основаны на «Не повторяйтесь». Например, принцип «Один и только один», применяемый только к функциональному поведению кода, может быть представлен как частный случай «Не повторяйтесь». Принцип «Открыто/Закрыто», говорящий, что «единица кода должна быть открыта для расширений, но закрыта для изменений», на практике работает лишь при условии следования принципу «Не повторяйтесь». Также и хорошо известный принцип «Единственность ответственности» требующий, чтобы класс имел «лишь одну причину для изменений», основывается на «Не повторяйтесь».
Будучи применимым к структуре, логике, процессу и функциональности, принцип «Не повторяйтесь» задает фундаментальное правило для разработчиков и ведет к созданию более простых, более сопровождаемых и более качественных приложений. И хотя существуют сценарии, в которых повторение может быть необходимым (например, требования к производительности), они должны применяться лишь там, где они действительно необходимы для решения реальных, а не воображаемых проблем.
Автор оригинала - Steve Smith