Рефакторинг кода

Рефакторинг кода

10 января 2023

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

Рефакторинг кода часто требуется, потому что:

  1. изменяется архитектура;
  2. необходимо масштабировать решение;
  3. требуется увеличить производительность;
  4. первая версия была сделана на скорую руку или «как можно дешевле»;
  5. появилась новая версия компилятора или библиотек;
  6. прошлые программисты могли допускать архитектурные ошибки;
  7. по мере эксплуатации становится понятно, что нужны новые функции.
Велосипед
Изобретение велосипеда
Восклицательный знак в заштрихованном круге

Низкокачественный код отличается громоздкостью и нечитаемостью, хранением паролей в 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 потребление cpu Потребление центрального процессора на ожидание.
25 нет параллельных cpu Некорректное распараллеливание задач или не использование потоков.
26 отдельная ветвь Отдельную ветвь кода для частных случаев.
27 библиотека Самописный код вместо использования библиотеки.
28 мало комментарий Недостаточное комментирование кода или чрезмерное комментирование очевидных участков.
Дуб на подпорке
Подпорка 600-летнего английского дуба Псково-Печерского монастыря

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