Введение
Работа с 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. Результаты могут отличаться в зависимости от модели и контекста.
Комментарии