Рефакторинг: как улучшать код, сохраняя поведение
💻 Информатика · 9 класс
Рефакторинг — последовательное изменение внутренней структуры программы без изменения её наблюдаемого поведения. Цель — сделать код понятнее и удобнее для дальнейшей работы. Если о

Рефакторинг — последовательное изменение внутренней структуры программы без изменения её наблюдаемого поведения. Цель — сделать код понятнее и удобнее для дальнейшей работы. Если одновременно добавляется новая возможность или меняется правило расчёта, это уже не только рефакторинг: такие изменения полезно отделять, чтобы легче находить ошибки.
Сначала зафиксируйте поведение
Возьмите небольшую функцию, которая считает стоимость покупки с доставкой. Запишите несколько входов и ожидаемых результатов: обычная сумма, нулевая сумма, граничное значение для бесплатной доставки. Эти примеры станут проверками. Без них фраза «после правки всё работает» часто означает только отсутствие видимой ошибки на одном запуске.
Не стоит начинать с полной перестройки файла. Выберите одну проблему: непонятное имя, повторяющийся расчёт, слишком длинная функция. Изменение должно иметь конкретную цель. Например, имя shipping_cost лучше объясняет назначение значения, чем x2, если это действительно стоимость доставки.
Разберите простой пример
Пусть одинаковый расчёт price * count повторяется в нескольких местах. Его можно выделить в функцию subtotal(price, count) либо сохранить результат в понятной переменной там, где повторение локально. После правки проверьте прежние примеры. Итоговые суммы должны остаться теми же.
Само выделение функции не гарантирует улучшения. Если новая функция скрывает одну очевидную операцию, а её имя ничего не объясняет, код может стать сложнее для чтения. Хорошее решение помогает заметить смысловую часть задачи: расчёт позиции, проверку скидки, форматирование результата. Границы должны следовать смыслу, а не произвольному числу строк.
Двигайтесь малыми шагами
Переименуйте одну переменную, запустите проверки. Затем выделите одну функцию и снова проверьте. Так при поломке понятно, какое изменение её вызвало. Система контроля версий помогает сохранить промежуточный рабочий вариант, но не подменяет проверку правильности.
Если обнаружилось, что скидка изначально считалась неверно, зафиксируйте это отдельно. Исправление дефекта меняет наблюдаемое поведение на проблемном входе. Смешивание исправления ошибки, добавления новой скидки и перестройки кода в одну правку затрудняет проверку, даже если каждое действие полезно само по себе.
Упражнения
1. Замена имён a и b на width и height при сохранении расчёта площади — рефакторинг? Да, если остальные эффекты не изменились. 2. Добавление нового способа доставки — рефакторинг? Нет: расширяется функциональность. 3. Зачем проверять граничную сумму? Именно на границе условия легко случайно заменить > на >= и изменить результат.
Для самостоятельной работы найдите три повторяющихся строки в собственной учебной программе. Предложите одно изменение и перечислите результаты, которые должны сохраниться. После правки сравните не только печать на экране, но и возвращаемые значения, ошибки и изменения входных данных, если программа их выполняет.
Связанные материалы
Алгоритмы: основа программирования и не только, Основы программирования на Python.
Источники и проверка
Мартин Фаулер: определение и практика рефакторинга.