November 12

Принцип DRY - Don’t Repeat Yourself

В чём суть: необходимо избегать повторений одного и того же кода.

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

Когда горит жопа у плохого разработчика от своего же кода

Ретроспектива

Впервые принцип был описан Энди Хантом и Дэйвом Томасом в книге «Программист-прагматик: путь от подмастерья к мастеру» 1999 года ISBN 978-0135957059

Данный принцип по сути переосмысление SSOT - Single Source Of Truth.

Википедия: В проектировании и теории информационных систем единый источник истины (SSOT) – это практика структурирования информационных моделей и схемы данных, которая подразумевает, что все фрагменты данных обрабатываются (или редактируются) только в одном месте. SSOT предоставляют достоверные, актуальные и пригодные к использованию данные.

Причина появления

  • Автор кода обладает низкими профессиональными навыками
  • Чаще всего дубли кода появляются в случае, когда разработчик слабо знаком с изменяемой им системой

Почему повторяемый код плох

  1. Сложность сопровождения
    • Автору кода необходимо держать в памяти все места дублей, когда требуется сделать модификацию одного из, иначе поведение в одном блоке изменится, в оставшихся нет.
    • Если же код сопровождает не автор, то уровень сложности возрастает кратно, так как кроме описанного выше, разработчику придётся ещё догадаться, что код требует изменение кода в нескольких блоках.
  2. Стоимость разработки/сопровождения
    • Для реализации кода нужно потратить больше времени на дублирование
    • Нужно потратить больше времени для изменение кода, а время разработчика стоит дорого
  3. Когнитивное усложнение кода
    • Читать мутную кодовую базу с дублями для мозга сильно непростая задача

Как можно обнаружить проблему

  • Популярные IDE могут показывать дубли кода
  • Изменяя алгоритм или поведение, приходится менять код в нескольких местах

Как исправить проблему

  • Применять правило "осмотритесь": перед реализацией нужно убедиться, что новая функциональность ещё не была реализована
  • Просканировать код средствами статического анализатора кода, коих во всех языках достаточно, и выискать дубли
  • Вынести дублируемый код в отдельную функцию и в местах дублирования использовать уже эту функцию
  • Если же код сложнее, чем вынос в отдельную функцию, следует подобрать абстракцию