Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Python: refactoring, behavior, regression

Как рефакторить код, не меняя его внешний результат и вывод?

Вопрос проверяет умение безопасно улучшать код: структуру, стиль и качество без изменения поведения, что критично для production.

Короткий ответ

Рефакторинг делают маленькими шагами и постоянно проверяют, что результат не изменился. Сначала фиксируют текущее поведение тестами или контрольными примерами. Затем меняют код так, чтобы каждый шаг был легко проверяем и откатываем. Если есть ввод/вывод, важно сохранить формат и порядок.

Длинный ответ

Определение

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


Безопасный процесс рефакторинга

1) Зафиксировать поведение

Перед изменениями важно иметь способ доказать, что ничего не сломалось.

  1. Написать тесты

  2. Или собрать набор входов и ожидаемых выходов (golden cases)


2) Делать маленькие атомарные шаги

  1. Переименовать переменную

  2. Вынести повтор в функцию

  3. Упростить условие

  4. Убрать дублирование

Каждый шаг должен быть проверяем отдельно.


3) Сохранять контракт функции

Нужно следить за тремя вещами:

  1. Сигнатура (аргументы и возвращаемое значение)

  2. Исключения (что и когда выбрасывается)

  3. Побочные эффекты (логирование, запись в файл, печать)


Пример: рефакторинг без изменения поведения

Было (условно “слишком много условий”):

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

Типовые риски

  1. “Случайно” поменяли поведение на не-скобочных символах

  2. Поменяли порядок вывода или формат строки

  3. Изменили тип возвращаемого значения (например, 0/1 вместо False/True)


Краткий вывод

Безопасный рефакторинг опирается на фиксацию поведения и маленькие проверяемые изменения. Если тесты есть — рефакторить можно уверенно и быстрее.

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    5

  • Сложность:

    6

Навыки

  • Python

    Python

Ключевые слова

#refactoring

#behavior

#regression

Подпишись на Python Developer в телеграм

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.