Главный рефакторинг

Посмотрел вчера на код после джуниора, сделал всего один рефакторинг и тут же удалил 380 строк. Задумался, вспоминая последние 10..15 рефакторингов, что делал. По сути все они были одним и тем же: убийство копипасты. Нет, иногда копипаста не плохо. Иногда она даже нужна и является элементом архитектуры. Но часто она всё-таки фу и бяка. И один из skill’ов, что разработчик должен натачивать в себе с первого же молочного зуба — чутьё на плохую копипасту и практику её уничтожения. Если этого нет, нет и хорошего разработчика, даже не надейтесь.

Более культурно это нынче называется DRY (Don’t repeat yourself) и за последние лет двадцать каждый уважающий себя учебник рекомендует следовать этому принципу (ещё до того, как его сформулировали).
Например, [Martin Fowler, Kent Beck, John Brant, William Opdyke, Don Roberts. Refactoring. Addison-Wesley, 1999]: «Number one in the stink parade is duplicated code. If you see the same code structure in more than one place, you can be sure that your program will be better if you find a way to unify them».
Например, [Steve McConnell. Code Complete. Microsoft Press, 2004]: «Duplicated code almost always represents a failure to fully factor the design in the first place». (на деле у него примерно такой же текст уже в 1998 году был.
Например, [Robert C. Martin. Clean Code. Prentice Hall, 2008]: «Every time you see duplication in the code, it represents a missed opportunity for abstraction. .. Find and eliminate duplication wherever you can».

Почему это важно? Даже вот не с позиции абстракций и прочего, но сугубо прагматично кодерски.
Во-первых, вы мешаете JIT’у и прочим оптимизациям. Если исходник в одном месте и часто вызывается, у него гораздо больше шансов на автоматическую оптимизацию, чем у того же исходника в двадцати местах с размазанными вызовами.
Во-вторых, вы мешаете коллегам изучать код не только увеличенным объёмом текста и пустыми ожиданиями «раз оно двоится, может, не просто так», но и тем, что в IDE не получится тыцнуть в один метод и найти его использование.
В-третьих, вы очевидно мешаете исправлять этот код. Я и в самом деле сегодня вынужден был заменить 20+ копипаст. Предположим, правил бы багу. Мне пришлось бы править её в 20+ местах, после чего генератор копипасты был бы упомянут в разных позах и разных занятиях. Не говоря уж о том, что в случае баги я мог бы в одном-двух местах её и не исправить, пропустив. В общем, беда.
В-четвёртых, вы мешаете делать рефакторинг. Довольно часто бывает так, что после выноса копипасты становится очевидным следующий шаг. А потом ещё один. Рефакторинг похож на падающие доминошки, после одной каки чистятся ещё десять и в конце красивый компактный понятный код. А когда перед глазами портянки, сложно сразу уцепить возможность улучшения.

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

Главный рефакторинг: Один комментарий

Добавить комментарий