7 промтов для рефакторинга legacy кода: стратегии и примеры для разработчиков

Введение

Работа с legacy-кодом — одна из самых сложных и частых задач в карьере любого разработчика. По данным отчёта Stripe (2024), разработчики тратят до 42% рабочего времени на понимание и поддержку существующего кода, а не на написание нового. Устаревшая кодовая база замедляет внедрение фич, увеличивает количество багов и демотивирует команду. Однако полный перезапуск проекта часто невозможен из-за бизнес-ограничений. Здесь на помощь приходит рефакторинг — контролируемое улучшение внутренней структуры без изменения внешнего поведения. А с появлением больших языковых моделей (LLM), таких как GPT-4o, Claude 3.5 Sonnet или Gemini 2.0, процесс рефакторинга можно ускорить в разы, используя правильно составленные промты.

Эта статья — практическая подборка из 7 готовых промтов для различных сценариев рефакторинга legacy кода. Каждый промт сопровождается пояснением, примером использования и рекомендациями по адаптации. Вы узнаете, как заставить AI не просто генерировать «красивый код», а проводить осмысленный рефакторинг с учётом контекста, тестов и архитектурных паттернов.

Почему AI-промты меняют подход к рефакторингу?

Традиционный рефакторинг — это итеративный процесс: вы читаете код, пишете тесты, вносите изменения, прогоняете тесты снова. LLM могут взять на себя часть рутины: анализ зависимостей, выявление антипаттернов, генерацию тестов и даже написание самого рефакторинга. Однако AI не умеет читать мысли: качество результата напрямую зависит от качества промта. Хороший промт должен содержать:
- контекст (язык, фреймворк, архитектура);
- цель (что именно нужно улучшить: читаемость, производительность, тестируемость);
- ограничения (не менять API, не затрагивать определённые модули);
- пример ожидаемого вывода.

Исследование Microsoft Research (2025) показало, что структурированные промты на 34% повышают точность рефакторинга, выполненного AI, по сравнению с неструктурированными запросами.

7 промтов для рефакторинга legacy кода

Промт 1: Декомпозиция «божественного объекта» (God Object)

Для чего: Разбить огромный класс, который делает всё, на несколько маленьких с единой ответственностью (Single Responsibility Principle).

Промт:

Ты — эксперт по рефакторингу на [язык, например Python]. У меня есть класс [название], который содержит более 2000 строк и нарушает принцип единственной ответственности. Вот его код:
[вставьте код]

Выполни рефакторинг:
1. Идентифицируй 3-5 логических групп методов (например, работа с БД, валидация, форматирование).
2. Создай отдельные классы для каждой группы.
3. Исходный класс должен делегировать вызовы новым классам, сохраняя публичный API.
4. Добавь docstring для каждого нового класса.
5. Не меняй сигнатуры публичных методов, которые используются в других файлах.

Выведи итоговый код для каждого класса и краткое описание изменений.

Пример:
Вы работаете с PHP-проектом, где класс OrderManager содержит методы для расчёта скидок, отправки email, записи в БД и генерации PDF. Промт выше заставит AI разделить его на DiscountCalculator, EmailNotifier, OrderRepository и PdfGenerator. ASI Biont поддерживает подключение к [название сервиса] через API — подробнее на asibiont.com/courses.

Промт 2: Замена цепочки if-else на полиморфизм или стратегию

Для чего: Устранить длинные условные конструкции, которые трудно читать и расширять.

Промт:

Рефакторинг: замени цепочку if-else на паттерн Стратегия (Strategy).

Исходный код на [язык]:
[вставьте код]

Требования:
- Создай интерфейс/абстрактный класс для стратегии.
- Реализуй конкретные стратегии для каждого условия.
- В клиентском коде используй фабрику стратегий или маппинг.
- Сохрани ту же логику, не меняй порядок операций.
- Выведи результирующий код и пример использования.

Пример:
Функция расчёта налога с 15 условиями по типу товара. После рефакторинга вы получите 15 классов-стратегий и чистый клиентский код.

Промт 3: Извлечение магических чисел и строк в константы

Для чего: Улучшить поддерживаемость и читаемость, убрать «магию».

Промт:

Найди в коде все магические числа, строки и булевы литералы (кроме 0, 1, true, false, пустых строк) и вынеси их в именованные константы или enum.

Исходный код:
[вставьте код]

Правила:
- Константы должны быть сгруппированы по смыслу (например, class PaymentConfig или enum PaymentLimits).
- Названия констант должны быть описательными (MAX_RETRY_COUNT, DEFAULT_TIMEOUT_MS).
- Замени все вхождения литералов на соответствующие константы.
- Выведи итоговый код и таблицу со старым значением -> новой константой.

Пример:
В коде встречается if (status === 3) — станет if (status === OrderStatus.PAID).

Промт 4: Написание unit-тестов для существующего кода

Для чего: Обеспечить безопасность рефакторинга — без тестов изменения опасны.

Промт:

Напиши unit-тесты для следующего кода, используя [фреймворк, например pytest или Jest].

Код:
[вставьте код]

Требования:
- Покрой все публичные методы, граничные случаи (null, пустой массив, отрицательные числа).
- Используй моки для внешних зависимостей (БД, API, файловая система).
- Тесты не должны вызывать побочных эффектов.
- Выведи тестовый файл целиком.

Важно: Проверьте сгенерированные тесты вручную — AI может пропустить краевые случаи.

Промт 5: Упрощение сложных условий с помощью guard clauses

Для чего: Уменьшить вложенность if-ов, сделать код плоским и понятным.

Промт:

Отрефактори следующий код, заменив глубокую вложенность на guard clauses (ранний возврат/exit).

Исходный код:
[вставьте код]

Правила:
- Каждое условие, которое прерывает выполнение, должно быть вынесено в начало метода.
- После guard clauses оставь основной поток без лишней вложенности.
- Сохрани логику и порядок проверок.
- Выведи результат в формате «было -> стало».

Пример:

# Было
def process(order):
    if order:
        if order.is_valid():
            if order.paid:
                # 20 строк логики

Стало:

def process(order):
    if not order:
        return
    if not order.is_valid():
        return
    if not order.paid:
        return
    # 20 строк логики

Промт 6: Миграция с устаревшего API на новый

Для чего: Перейти с библиотеки/фреймворка, который больше не поддерживается, на современный аналог.

Промт:

Мигрируй код с [старая библиотека] на [новая библиотека].

Исходный код:
[вставьте код]

Требования:
- Сохрани функциональность 1:1.
- Используй эквиваленты методов из новой библиотеки.
- Если прямого аналога нет, предложи обёртку (adapter) с тем же интерфейсом.
- Выведи итоговый код и список изменений с комментариями.

Пример:
Миграция с requests на httpx в Python: замена requests.get на httpx.get, обработка таймаутов, поддержка async.

Промт 7: Анализ и устранение code smells

Для чего: Обнаружить скрытые проблемы (длинные параметры, дублирование, неуместная близость).

Промт:

Проведи анализ кода на code smells. Исходный код:
[вставьте код]

Выведи таблицу:
| Строка | Тип code smell | Описание | Предлагаемое исправление |

Типы: Long Method, Large Class, Primitive Obsession, Data Clumps, Switch Statements, Comments (заменяющие код), Lazy Class, Speculative Generality.

Для каждого найденного code smell предложи конкретный рефакторинг (извлечение метода, вынос класса, замена параметров объектом и т.д.).

Как адаптировать промты под свой проект

  1. Указывайте язык и фреймворк: Без этого AI может сгенерировать код на другом языке или с неподходящими паттернами.
  2. Давайте контекст: Если код относится к микросервису, упомяните это. Если есть архитектурные ограничения (например, нельзя использовать наследование) — напишите.
  3. Используйте итеративный подход: Не ждите идеального результата с первого раза. Правьте промт, добавляйте уточнения.
  4. Проверяйте вручную: AI может ввести новые баги. Всегда прогоняйте тесты.

Заключение

Рефакторинг legacy кода — это не просто техническая необходимость, а инвестиция в будущее проекта. Правильно составленные промты превращают AI из игрушки в мощного ассистента, который экономит часы рутинной работы. Используйте предложенные шаблоны как отправную точку, адаптируйте их под свой стек и не забывайте про тесты. Помните: лучший рефакторинг — тот, который не ломает продакшен. А с хорошими промтами вы минимизируете риски и ускорите процесс.

Начните с малого: возьмите один класс или одну функцию, примените промт из подборки, оцените результат. Через месяц вы удивитесь, как много кода можно улучшить без боли.

← Все статьи

Комментарии