четверг, 13 января 2011 г.

30/97: Не повторяйтесь

Это перевод Don't Repeat Yourself. Автор: Steve Smith.

Из "97-ми вещей, которые должен знать каждый программист".

Из всех принципов программирования "Не повторяйтесь" (DRY - Don't Repeat Yourself), возможно, один из самых фундаментальных. Принцип был сформулирован Энди Хантом и Дэйвом Томасом в книге The Pragmatic Programmer и лег в основу множества известных программистских практик и шаблонов проектирования. Разработчик, умеющий находить повторения и понимающий как их избежать при помощи соответствующих практик или абстракций, может писать гораздо более аккуратный код по сравнению с тем, кто постоянно загрязняет приложение ненужными повторами.

Повторение – это потери

Каждая строчка кода, попавшая в производство, должна сопровождаться, и является возможным источником ошибок в будущем. Повторение раздувает код, давая больше возможностей для ошибок и внося дополнительное усложнение в систему. Раздутая система также затрудняет разработчикам понимание работы всей системы. К тому же становится сложно определить, что изменения в одной части достаточны, и не нужно их внести еще раз где-нибудь еще из-за повторения. "Не повторяйтесь" требует, чтобы правило "каждая часть знаний должна иметь единственное, недвусмысленное, официальное представление в системе" всегда соблюдалось.

Повторение процесса требует автоматизации

Множество процессов в разработке ПО повторяемы и легко автоматизируемы. Принцип "Не повторяйтесь" применяется здесь так же успешно, как и в исходном коде. Ручное тестирование медленно, ненадежно и сложно повторяемо, поэтому автоматизация тестирования должна применяться везде, где это возможно. Интеграция ПО может быть времязатратной и ненадежной, если делается вручную, поэтому процедура сборки должна выполняться как можно чаще, идеально при каждом помещении изменений. Там, где существует неприятный ручной процесс, который можно автоматизировать, то он должен быть автоматизирован. Цель – обеспечить, чтобы существовал единственный способ выполнить задачу, и этот способ должен быть как можно проще и легче.

Повторение логики требует абстракции

Повторение логики может принимать множество форм. Copy-paste, if-then, switch-case – вот самые простые способы определить проблемное место. Множество шаблонов проектирования предназначены для уменьшения повторов в логике. Если объект требует выполнения нескольких действий перед использованием, это может быть решено при помощи "Абстрактной фабрики" или "Фабричного метода". Если объект имеет множество вариаций поведения, то это может быть реализовано шаблоном "Стратегия" вместо большой if-then структуры. Само описание шаблонов проектирования – попытка снизить повторяемость усилий по решению часто встречающихся задач. Еще "Не повторяйтесь" может применяться к структурам данных (схемы баз данных), давая в результате нормализированную форму.

Основной принцип

Другие принципы разработки также основаны на "Не повторяйтесь". Например, принцип "Один и только один", применяемый только к функциональному поведению кода, может быть представлен как частный случай "Не повторяйтесь". Принцип "Открыто/Закрыто", говорящий, что "единица кода должна быть открыта для расширений, но закрыта для изменений", на практике работает лишь при условии следования принципу "Не повторяйтесь". Также и хорошо известный принцип "Единственность ответственности" требующий, чтобы класс имел "лишь одну причину для изменений", основывается на "Не повторяйтесь".

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

3 комментария:

  1. Александр, а это ваши переводы 97 вещей?

    ОтветитьУдалить
  2. Вы знаете, начинал делать сам. А потом наткнулся на этот вариант. Ну и на фоне нехватки времени бес попутал - начал брать части оттуда.

    Да, нехорошо получилось. Надо с этим что-то делать.

    ОтветитьУдалить
  3. А ты пиши что взято оттуда, мол источник перевода этот. Думаю не в обиде будут.
    Да и лучше когда материал в 2 местах - резерв 1:1 )

    ОтветитьУдалить

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

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