Попробовать бесплатно
AgileКонцепцияПроцессКачество

Рефакторинг (Refactoring)

Изменение внутреннего устройства кода без изменения его поведения: код становится понятнее и дешевле в правке, а результат работы остаётся прежним.

КРАТКО
Рефакторинг меняет устройство кода, сохраняя поведение. Термин ввёл Уильям Опдайк в диссертации 1992 года, а массовым приём сделала книга Мартина Фаулера 1999 года; второе издание вышло в 2018-м. В ней же разошлись «запахи кода» — признаки того, что пора убираться: длинный метод, дублирование, класс, который знает слишком много о соседях. Условие всей затеи — тесты. Без них перестройка устройства превращается в переписывание с надеждой.
СИНОНИМЫ:рефакторингrefactoringпереработка кодачистка кодазапахи кода

Определение узкое, и в этом его смысл. Рефакторинг не добавляет возможностей и не чинит ошибки. Если во время уборки поменялось поведение, это уже другая работа, и путать их дорого: при разборе сломанного релиза непонятно, что искать.

Как это делают

  • Убедиться, что участок закрыт тестами.
  • Делать маленькие шаги, запуская тесты после каждого.
  • Держать код рабочим после каждого шага, включая промежуточные.

Запахи кода

Фаулер собрал каталог признаков, по которым узнают проблемные места. Длинный метод, длинный список параметров, дублирование, «завистливая» функция, которая лезет в данные соседнего класса. Запах не означает ошибку. Он означает повод посмотреть внимательнее.

Когда за него берутся

Работающая практика — уборка по дороге: правишь модуль ради задачи и заодно приводишь в порядок то, что мешает. Отдельный «спринт рефакторинга» почти всегда заканчивается спором с заказчиком о том, зачем квартал ушёл на работу без видимого результата.

КОГДА ПРИМЕНЯТЬ
  • Правка простой задачи каждый раз занимает дни
  • Перед добавлением возможности в запутанный участок
  • После прохождения теста в цикле TDD
  • Код разбирают на обзоре, и никто не может объяснить, как он работает
КОГДА НЕ СТОИТ
  • Нет тестов и нет возможности написать их до начала
  • Код уйдёт из системы в ближайшие месяцы
  • Идёт горящий инцидент: сначала чинят, уборка потом
ПРИМЕР

Функция расчёта доставки разрослась до трёхсот строк с семью вложенными условиями. Разработчик обкладывает её тестами на текущее поведение, потом по одному выносит правила в отдельные функции: зона, вес, тип отправления. Поведение не меняется ни на шаг, тесты зелёные весь путь. Через месяц добавление новой зоны занимает час вместо дня.

КАК ИСПОЛЬЗОВАТЬ В SHTAB

Крупную уборку стоит заводить обычной задачей с описанием того, что станет дешевле после неё. Формулировка «привести код в порядок» не проходит приоритизацию ни у одного заказчика; «добавление новой зоны доставки перестанет занимать день» проходит. В Shtab такие задачи удобно связывать с теми, ради которых уборка затевалась: тогда видно, что она окупилась.

Попробовать бесплатно

Вопросы про «Рефакторинг (Refactoring)»

Рефакторинг идёт маленькими шагами, и после каждого система работает. Переписывание останавливает поведение целиком до момента, когда новая версия заработает. Риск разный: сорванный рефакторинг откатывается одним шагом, сорванное переписывание съедает месяцы.

Применяйте термины на практике

База знаний, задачи и цели — в одном сервисе. Бесплатно — без лимита по числу людей.