Капитальный ремонт или перепланировку хоть раз в жизни, пожалуй, делал каждый. Трубы и проводка изнашиваются, отделочные материалы и предметы интерьера устаревают, расположение комнат перестает быть удобным. Рефакторинг сравним с капитальным ремонтом и предполагает перепроектирование и исправление кода. Меняется внутренняя структура программы, в то время как поведение остается прежним.
Рефакторинг кода часто требуется, потому что:
- изменяется архитектура;
- необходимо масштабировать решение;
- требуется увеличить производительность;
- первая версия была сделана на скорую руку или «как можно дешевле»;
- появилась новая версия компилятора или библиотек;
- прошлые программисты могли допускать архитектурные ошибки;
- по мере эксплуатации становится понятно, что нужны новые функции.
Низкокачественный код отличается громоздкостью и нечитаемостью, хранением паролей в cookies, сложностью URL, именованием переменных на разных языках.
Рефакторинг исправляет.
01 | Разнородный стиль именования переменных, методов, классов. | |||
02 | Дублирование кода. | |||
03 | Длинные методы и классы. | |||
04 | Перегруженный список параметров функций и методов. | |||
05 | Длинные блоки ветвления. | |||
06 | Магические значения. | |||
07 | Использование непонятных аббревиатур. | |||
08 | Жесткое кодирование допущений. | |||
09 | Чрезмерное конфигурирование. | |||
10 | Запутанный код. | |||
11 | Чрезмерное количество уровней абстракции. | |||
12 | Чрезмерную взаимозависимость классов друг от друга. | |||
13 | Отсутствие проверки входных данных. | |||
14 | Перегрузку классов и компонентов разнородным функционалом. | |||
15 | Чрезмерную обобщенность кода. | |||
16 | Хранение временных значений в полях. | |||
17 | Классы-посредники. | |||
18 | Недостаток изоляции классов. | |||
19 | Неуместное наследование классов. | |||
20 | Наследование вместо делегирования. | |||
21 | Логику вне классов предметной области. | |||
22 | Прямые вызовы между далеко расположенными частями системы. | |||
23 | Неиспользуемый код. | |||
24 | Потребление центрального процессора на ожидание. | |||
25 | Некорректное распараллеливание задач или не использование потоков. | |||
26 | Отдельную ветвь кода для частных случаев. | |||
27 | Самописный код вместо использования библиотеки. | |||
28 | Недостаточное комментирование кода или чрезмерное комментирование очевидных участков. |

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