Что такое рефакторинг и как делать его без поломок
Что такое рефакторинг простыми словами: изменение устройства кода без изменения поведения. Чем он не является, зачем окупается и как делать его безопасно.
Рефакторинг — это изменение устройства кода без изменения того, что код делает. Пользователь не должен заметить никакой разницы: те же экраны, те же кнопки, тот же результат. Меняется только то, как всё устроено внутри.
Если коротко ответить на вопрос «что такое рефакторинг», это уборка в мастерской. Инструменты те же, станки те же, но теперь понятно, где что лежит, и следующая работа идёт быстрее.
Чем рефакторинг не является
Слово часто используют для всего подряд, и из-за этого его боятся. Вот что рефакторингом не считается.
- Переписывание с нуля. Рефакторинг идёт маленькими шагами по работающему коду, а не заменяет его новым.
- Добавление функций. Если после изменения приложение умеет что-то новое, это разработка, а не рефакторинг.
- Исправление ошибок. Найти баг во время рефакторинга — обычное дело, но чинить его лучше отдельным шагом. Иначе непонятно, что изменило поведение: исправление или случайная поломка.
- Смена дизайна. Перекрасить кнопки — это работа над интерфейсом. Рефакторинг интерфейса может разбить огромный компонент на части, но выглядеть всё должно так же.
Главный критерий простой: поведение до и после одинаковое. Если ты не можешь это проверить, ты не рефакторишь, а надеешься.
Как выглядит рефакторинг на практике
Типичные шаги, особенно в коде, написанном с ИИ:
- Убрать дубли. Одна и та же функция расчёта цены скопирована в три файла, и в одном из них уже исправлена ошибка, а в двух других нет. Оставляешь одну версию, остальные места вызывают её.
- Разбить огромный файл. Компонент на полторы тысячи строк, где и загрузка данных, и форма, и таблица, и модальные окна, делится на несколько понятных частей.
- Дать имена.
data2,handleClick3иtempпревращаются вunpaidInvoicesиsubmitPayment. Число86400в коде получает имяSECONDS_IN_DAY. - Убрать мёртвый код. Функции, которые никто не вызывает, и закомментированные куски, оставшиеся от прошлых попыток.
- Развести слои. Запросы к базе, бизнес-правила и отрисовка, перемешанные в одном месте, разносятся по своим.
Зачем это нужно и почему окупается
Рефакторинг сам по себе не приносит пользователям ничего нового, поэтому его легко откладывать. Окупается он в следующих изменениях.
В запутанном коде каждая новая функция стоит дороже предыдущей: нужно найти все места, где что-то задето, и надеяться, что не пропустил. В аккуратном коде изменение делается в одном месте и ломает меньше.
С ИИ-ассистентами это работает ещё заметнее. Модель видит ограниченный кусок проекта. Если логика размазана по десяти файлам с похожими именами, ассистент правит одну копию и не трогает остальные. В маленьких файлах с понятными именами он ошибается реже и быстрее находит, что менять.
Как делать рефакторинг безопасно
- Сначала зафиксируй поведение. Лучше всего — автотестами на то, что трогаешь. Если тестов нет, запиши руками несколько сценариев проверки: войти, создать заказ, оплатить, отменить.
- Сохрани точку возврата. Закоммить рабочее состояние в git до начала. Если что-то пойдёт не так, ты вернёшься за секунды.
- Маленькие шаги. Один шаг — одно изменение: переименовал, проверил, закоммитил. Вынес функцию, проверил, закоммитил. Большой рефакторинг за один заход почти всегда заканчивается фразой «где-то что-то сломалось».
- Не смешивай с новыми функциями. Сначала приведи код в порядок, потом добавляй. Или наоборот, но не одновременно.
- Ставь ИИ жёсткие рамки. Проси конкретно: «вынеси расчёт цены в отдельную функцию, поведение не меняй, ничего другого не трогай». Потом читай дифф. Ассистент любит заодно «улучшить» соседний код.
- Начинай с того, что часто меняется. Идеальный порядок в модуле, который никто не трогает годами, не окупится. Порядок там, где ты работаешь каждую неделю, окупится быстро.
Коротко
- Рефакторинг — изменение устройства кода без изменения его поведения.
- Это не переписывание, не новые функции и не исправление багов.
- Он окупается тем, что каждое следующее изменение дешевле и безопаснее, а ИИ-ассистенты ошибаются реже.
- Делать его стоит маленькими шагами с проверкой и коммитом после каждого.
- Начинать лучше с кода, который ты меняешь чаще всего.
SUBXCAT помогает привести код в порядок без остановки разработки и без сюрпризов для пользователей.