Вопрос проверяет умение безопасно улучшать код: структуру, стиль и качество без изменения поведения, что критично для production.
Рефакторинг делают маленькими шагами и постоянно проверяют, что результат не изменился. Сначала фиксируют текущее поведение тестами или контрольными примерами. Затем меняют код так, чтобы каждый шаг был легко проверяем и откатываем. Если есть ввод/вывод, важно сохранить формат и порядок.
Рефакторинг — это изменение внутренней структуры кода без изменения его внешнего поведения: результата, побочных эффектов, формата вывода и контрактов.
Перед изменениями важно иметь способ доказать, что ничего не сломалось.
Написать тесты
Или собрать набор входов и ожидаемых выходов (golden cases)
Переименовать переменную
Вынести повтор в функцию
Упростить условие
Убрать дублирование
Каждый шаг должен быть проверяем отдельно.
Нужно следить за тремя вещами:
Сигнатура (аргументы и возвращаемое значение)
Исключения (что и когда выбрасывается)
Побочные эффекты (логирование, запись в файл, печать)
Было (условно “слишком много условий”):
def is_valid(s: str) -> bool:
stack = []
for ch in s:
if ch == '(' or ch == '[' or ch == '{':
stack.append(ch)
else:
if ch == ')':
if not stack or stack.pop() != '(':
return False
elif ch == ']':
if not stack or stack.pop() != '[':
return False
elif ch == '}':
if not stack or stack.pop() != '{':
return False
return len(stack) == 0
Стало (логика та же, код проще):
def is_valid(s: str) -> bool:
stack = []
pairs = {')': '(', ']': '[', '}': '{'}
open_set = set(pairs.values())
for ch in s:
if ch in open_set:
stack.append(ch)
elif ch in pairs:
if not stack or stack.pop() != pairs[ch]:
return False
return not stack
“Случайно” поменяли поведение на не-скобочных символах
Поменяли порядок вывода или формат строки
Изменили тип возвращаемого значения (например, 0/1 вместо False/True)
Безопасный рефакторинг опирается на фиксацию поведения и маленькие проверяемые изменения. Если тесты есть — рефакторить можно уверенно и быстрее.