10 промтов для рефакторинга legacy кода: от хаоса к порядку с помощью AI

Введение

Работа с legacy-кодом — неизбежная реальность для любого разработчика, который не первый год в профессии. По данным отчета Stripe (2021), разработчики тратят около 42% рабочего времени на технический долг, включая рефакторинг и отладку. К 2026 году, с ростом сложности систем, эта цифра, по оценкам экспертов, только увеличилась. Но что, если часть этой рутины можно переложить на AI?

Современные языковые модели (GPT-4o, Claude 3.5, Gemini Ultra) умеют не только генерировать новый код, но и анализировать существующий, выявлять антипаттерны и предлагать рефакторинг. Однако промты для AI — это не магия, а инженерия. Без правильной постановки задачи вы рискуете получить «галлюцинации» или поверхностные правки.

В этой статье — 10 проверенных промтов для рефакторинга legacy-кода, разбитых на три уровня сложности: базовые (для новичков), продвинутые (для опытных) и экспертные (для архитекторов). Каждый промт сопровождается примером результата и рекомендациями по использованию.

Базовые промты (уровень 1: чистка кода)

Промт 1: Удаление мёртвого кода

Задача: Найти и удалить неиспользуемые переменные, функции, импорты и комментарии.

Промт:

Проанализируй следующий код на Python. Найди:
1. Неиспользуемые импорты
2. Переменные, которые объявлены, но нигде не используются
3. Функции, которые никогда не вызываются
4. Закомментированные блоки кода старше 3 месяцев (предположи)

Верни только исправленный код с краткими пояснениями, почему удалил каждый фрагмент.

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

Пример результата:

# Было:
import os
import sys
from datetime import datetime

def old_func():
    pass

def main():
    x = 10
    y = 20  # не используется
    print(x)

# Стало:
import os  # оставлен, если используется ниже по коду

def main():
    x = 10
    print(x)
# Примечание: удалён импорт sys (не используется), datetime (не используется), функция old_func (не вызывается), переменная y.

Промт 2: Замена магических чисел на константы

Задача: Выявить и заменить все «магические числа» (literal numbers) на именованные константы.

Промт:

В коде ниже найди все магические числа (числовые литералы, кроме 0, 1, -1, True, False). Замени их на константы с понятными именами в формате UPPER_SNAKE_CASE. Константы размести в начале файла или в отдельном конфиг-словаре.

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

Пример результата:

# Было:
def calculate_discount(price, user_type):
    if user_type == 'vip':
        return price * 0.8
    else:
        return price * 0.95

# Стало:
VIP_DISCOUNT_RATE = 0.8
REGULAR_DISCOUNT_RATE = 0.95

def calculate_discount(price, user_type):
    if user_type == 'vip':
        return price * VIP_DISCOUNT_RATE
    else:
        return price * REGULAR_DISCOUNT_RATE

Продвинутые промты (уровень 2: рефакторинг логики)

Промт 3: Разделение «божественного объекта» (God Object)

Задача: Класс, который делает всё — разбить на несколько классов с единственной ответственностью.

Промт:

Класс UserManager выполняет следующие функции: аутентификация, работа с БД, отправка email, валидация данных, логирование. Раздели его на несколько классов в соответствии с принципом единственной ответственности (SRP). Используй паттерны: Repository для БД, Service для логики, Logger для логирования. Сохрани обратную совместимость через фасад, если необходимо.

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

Пример результата:

# До: один класс UserManager с 500+ строк
# После:
class UserRepository:
    def save(self, user): ...

class EmailService:
    def send_welcome(self, email): ...

class AuthService:
    def login(self, credentials): ...

class UserFacade:
    def __init__(self):
        self.repo = UserRepository()
        self.email = EmailService()
        self.auth = AuthService()
    # фасадные методы для обратной совместимости

Промт 4: Замена if-else на полиморфизм

Задача: Избавиться от длинных цепочек if-else с помощью стратегии или полиморфизма.

Промт:

Функция process_payment содержит 7 вложенных условий для разных типов платежей (credit_card, paypal, crypto, apple_pay, google_pay, bank_transfer, gift_card). Рефакторинг: создай интерфейс PaymentMethod и конкретные классы для каждого типа. Используй фабричный метод для выбора стратегии.

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

Пример результата:

from abc import ABC, abstractmethod

class PaymentMethod(ABC):
    @abstractmethod
    def pay(self, amount): ...

class CreditCardPayment(PaymentMethod):
    def pay(self, amount): ...

class PayPalPayment(PaymentMethod):
    def pay(self, amount): ...

class PaymentFactory:
    methods = {
        'credit_card': CreditCardPayment,
        'paypal': PayPalPayment,
    }
    @staticmethod
    def get_method(type):
        return PaymentFactory.methods[type]()

Экспертные промты (уровень 3: архитектурный рефакторинг)

Промт 5: Миграция с процедурного на ООП

Задача: Переписать спагетти-код на объектно-ориентированную архитектуру.

Промт:

Дан следующий процедурный код на PHP (или Python/JS). Он представляет собой 1000+ строк с глобальными переменными, функциями и прямыми вызовами БД. Рефакторинг: перепиши его в ООП-стиле с использованием Dependency Injection, Repository Pattern и Service Layer. Сохрани ту же бизнес-логику, но сделай код тестируемым. Добавь интерфейсы.

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

Пример результата:

// До: глобальная переменная $db, функция get_users()
// После:
interface UserRepositoryInterface {
    public function findAll(): array;
}

class MySQLUserRepository implements UserRepositoryInterface {
    private PDO $db;
    public function __construct(PDO $db) { $this->db = $db; }
    public function findAll(): array { ... }
}

class UserService {
    public function __construct(private UserRepositoryInterface $repo) {}
    public function getActiveUsers(): array { ... }
}

Промт 6: Оптимизация N+1 запросов

Задача: Найти и исправить проблему N+1 запросов в ORM.

Промт:

В коде ниже используется цикл для загрузки связанных сущностей, что вызывает N+1 запрос. Перепиши его с использованием eager loading (JOIN или IN-запрос). Если возможно, используй batch-загрузку. Для Django  select_related/prefetch_related, для Laravel  with(), для SQLAlchemy  joinedload().

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

Пример результата:

# Django: Было
for order in Order.objects.all():
    print(order.customer.name)  # N+1 запросов

# Стало
orders = Order.objects.select_related('customer').all()
for order in orders:
    print(order.customer.name)  # всего 1 запрос

Промт 7: Внедрение Unit-тестов для старого кода

Задача: Написать тесты для нететируемого кода с помощью паттерна «Золотое тестирование».

Промт:

Дан legacy-код без тестов. Он содержит зависимости на внешние API и БД. Напиши для него unit-тесты, используя:
- Mock/Stub для внешних зависимостей
- Golden Master Testing (сначала записать вывод, потом сравнивать)
- Покрытие ключевых ветвей (min 80%)

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

Пример результата:

import pytest
from unittest.mock import Mock

def test_process_order_golden_master():
    # Arrange
    mock_api = Mock()
    mock_api.fetch_data.return_value = {"status": "ok"}
    service = OrderService(mock_api)

    # Act
    result = service.process(123)

    # Assert
    assert result == {"order_id": 123, "status": "processed"}
    mock_api.fetch_data.assert_called_once_with(123)

Промт 8: Декомпозиция монолита на модули

Задача: Разделить монолитное приложение на слабосвязанные модули.

Промт:

Монолитное приложение имеет 50 000 строк в одном файле. Предложи архитектурный рефакторинг: выдели минимум 5 модулей по бизнес-доменам (например: каталог, корзина, пользователи, заказы, платежи). Для каждого модуля определи:
- Границы ответственности
- Интерфейсы для взаимодействия
- Схему зависимостей (избегай циклических)
- Пример структуры папок

Код прилагается (если объёмный — укажи ключевые классы).

Пример результата:

project/
├── modules/
│   ├── catalog/        # Товары, категории
│   ├── cart/           # Корзина (зависит от catalog)
│   ├── user/           # Пользователи, роли
│   ├── order/          # Заказы (зависит от cart, user, payment)
│   └── payment/        # Платежи
├── shared/             # Общие утилиты, DTO
└── main.py             # Точка входа

Промт 9: Миграция с устаревшего фреймворка

Задача: Переписать код с устаревшего фреймворка (например, jQuery, CodeIgniter) на современный (React/Vue, Laravel/Symfony).

Промт:

Код написан на jQuery/CodeIgniter 3. Предложи план миграции на React + Laravel 11. Конвертируй следующие функции:
- AJAX-запросы (заменить на fetch/axios)
- Манипуляции DOM (заменить на Virtual DOM)
- Роутинг (заменить на Laravel routes + React Router)
- Работа с формами (заменить на Formik или Livewire)

Давай пошагово: сначала бэкенд-API, затем фронтенд-компоненты.

Пример результата:

// jQuery: $.ajax({ url: '/users', method: 'GET' })
// React: useEffect(() => { fetch('/api/users').then(...) }, [])

Промт 10: Аудит безопасности legacy-кода

Задача: Найти уязвимости в старом коде (SQL-инъекции, XSS, CSRF, insecure deserialization).

Промт:

Проведи аудит безопасности следующего legacy-кода. Ищи:
1. Конкатенацию строк в SQL-запросах (SQL-инъекции)
2. Неэкранированный вывод пользовательских данных в HTML (XSS)
3. Отсутствие CSRF-токенов
4. Использование insecure deserialization (pickle, eval, unserialize)
5. Хранение паролей в открытом виде

Для каждой уязвимости укажи: строку кода, тип уязвимости, риск (Critical/High/Medium), рекомендацию по исправлению.

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

Пример результата:
| Строка | Тип уязвимости | Риск | Рекомендация |
|--------|----------------|------|--------------|
| 42 | SQL Injection | Critical | Использовать параметризованные запросы: cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,)) |
| 87 | XSS | High | Экранировать вывод: htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8') |

Заключение

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

Начните с малого: запустите промт 1 или 2 на участке кода, который давно хотели почистить. Увидите, как AI подсветит то, на что вы не обращали внимания. А если вы хотите системно подойти к оптимизации кода, обратите внимание на курсы, которые учат работать с AI как с ассистентом разработчика — это инвестиция, которая окупается уже в первом спринте.

Статья написана в июле 2026 года. Все промты протестированы на GPT-4o и Claude 3.5 Sonnet. Результаты могут отличаться в зависимости от модели и контекста.

← Все статьи

Комментарии

Читайте также

Перестаньте терять лиды: как курс по ИИ для продаж и маркетинга на Asibiont.com создает современную воронку продаж

8 июля 2026

Edge AI на Raspberry Pi: интеграция Sensor Fusion с AI-агентом ASI Biont для предиктивного обслуживания

8 июля 2026

TypeScript — статическая типизация в JavaScript: как мы сократили баги на 80% и перестали бояться релизов

8 июля 2026

Трудовое право РФ: как AI-тьютор помогает разобраться в ТК и избежать кадровых споров

8 июля 2026

Как освоить Power BI для бизнес-аналитики: глубокое погружение в курс «Power BI — бизнес-аналитика и визуализация данных»

8 июля 2026

JavaScript для веб-разработки: как AI-обучение на asibiont.com ускоряет путь от новичка до профи

8 июля 2026

Спортивное право и киберспорт (WADA, CAS, FIFA, UEFA): как AI-обучение на Asibiont меняет подготовку юристов в 2026 году

8 июля 2026

JavaScript для веб-разработки: старт в IT с AI-обучением на asibiont.com

8 июля 2026

Операционные системы и системное программирование: почему этот курс — ваш билет в мир Linux, C и Rust в 2026 году

8 июля 2026