November 12
Принцип DRY - Don’t Repeat Yourself
В чём суть: необходимо избегать повторений одного и того же кода.
И казалось бы, тут всё просто и можно на этом пост завершить. Но вы даже представить себе не можете, как часто этот принцип нарушается даже разработчиками, занимающими высокие позиции в компаниях.
Ретроспектива
Впервые принцип был описан Энди Хантом и Дэйвом Томасом в книге «Программист-прагматик: путь от подмастерья к мастеру» 1999 года ISBN 978-0135957059
Данный принцип по сути переосмысление SSOT - Single Source Of Truth.
Википедия: В проектировании и теории информационных систем единый источник истины (SSOT) – это практика структурирования информационных моделей и схемы данных, которая подразумевает, что все фрагменты данных обрабатываются (или редактируются) только в одном месте. SSOT предоставляют достоверные, актуальные и пригодные к использованию данные.
Причина появления
- Автор кода обладает низкими профессиональными навыками
- Чаще всего дубли кода появляются в случае, когда разработчик слабо знаком с изменяемой им системой
Почему повторяемый код плох
- Сложность сопровождения
- Автору кода необходимо держать в памяти все места дублей, когда требуется сделать модификацию одного из, иначе поведение в одном блоке изменится, в оставшихся нет.
- Если же код сопровождает не автор, то уровень сложности возрастает кратно, так как кроме описанного выше, разработчику придётся ещё догадаться, что код требует изменение кода в нескольких блоках.
- Стоимость разработки/сопровождения
- Для реализации кода нужно потратить больше времени на дублирование
- Нужно потратить больше времени для изменение кода, а время разработчика стоит дорого
- Когнитивное усложнение кода
Как можно обнаружить проблему
- Популярные IDE могут показывать дубли кода
- Изменяя алгоритм или поведение, приходится менять код в нескольких местах
Как исправить проблему
- Применять правило "осмотритесь": перед реализацией нужно убедиться, что новая функциональность ещё не была реализована
- Просканировать код средствами статического анализатора кода, коих во всех языках достаточно, и выискать дубли
- Вынести дублируемый код в отдельную функцию и в местах дублирования использовать уже эту функцию
- Если же код сложнее, чем вынос в отдельную функцию, следует подобрать абстракцию