Введение
Каждый разработчик сталкивался с legacy-кодом: монолитными функциями на 500 строк, магическими числами без комментариев, смешением SQL и HTML в одном файле. По данным отчёта Stripe (2018), разработчики тратят до 42% рабочего времени на технический долг — и рефакторинг legacy-кода остаётся одной из самых трудоёмких задач. Современные языковые модели (GPT-4, Claude 3, YandexGPT) могут ускорить этот процесс, если правильно формулировать промты. В этой подборке — 15 проверенных стратегий с примерами кода и результатами.
1. Базовый промт: документирование непонятного кода
Задача: Понять, что делает legacy-функция без документации.
Промт: Объясни, что делает этот код на Python. Разбей на логические блоки и опиши каждый. Если есть потенциальные ошибки или антипаттерны — укажи их. Код: [вставка]
Пример результата: Для функции с 200 строками и вложенными циклами модель вернёт описание в 3-4 абзаца с выделением блоков валидации, обработки данных и записи в БД.
2. Базовый промт: выделение магических чисел в константы
Задача: Заменить числа-литералы на именованные константы.
Промт: Найди в этом коде все магические числа и замени их на именованные константы с осмысленными названиями. Используй enum или константы уровня модуля. Код: [вставка]
Пример результата: Число 86400 превращается в const SECONDS_IN_DAY = 86400, 0.15 — в DISCOUNT_RATE = 0.15.
3. Базовый промт: разбиение длинных функций
Задача: Разделить функцию на 300+ строк на несколько маленьких.
Промт: Разбей эту функцию на несколько меньших функций по принципу единой ответственности (Single Responsibility). Каждая новая функция должна делать только одно действие. Сохрани общую логику, но улучши читаемость. Код: [вставка]
Пример результата: Модель сгенерирует 5-7 функций с названиями validateInput(), calculateTax(), formatOutput() и т.д.
4. Базовый промт: удаление дублирования кода
Задача: Найти и устранить copy-paste.
Промт: Проанализируй этот проект на наличие повторяющихся блоков кода (дублирования). Предложи способ вынести общий код в отдельные функции или классы. Приведи пример рефакторинга для самого частого паттерна. Код: [вставка]
Пример результата: Модель находит 3 повторяющихся блока с расчётом скидки и предлагает единую функцию applyDiscount(price, rate).
5. Продвинутый промт: миграция с устаревшего синтаксиса
Задача: Переписать код с ES5 на ES6+ (JavaScript) или с Python 2 на Python 3.
Промт: Перепиши этот код с использованием современного синтаксиса. Для Python: замени print-операторы на функции, используй f-строки вместо %-форматирования, замени устаревшие библиотеки. Для JS: замени var на let/const, используй стрелочные функции, шаблонные строки. Код: [вставка]
Пример результата: var x = 10; → const x = 10;, print "Hello" → print("Hello").
6. Продвинутый промт: введение типизации в динамический код
Задача: Добавить аннотации типов в Python или TypeScript-подобные комментарии в JS.
Промт: Добавь аннотации типов (type hints) в этот Python-код. Используй typing-модуль для сложных типов (List, Dict, Optional). Если код использует динамические типы — предложи рефакторинг для стабилизации типов. Код: [вставка]
Пример результата: def get_user(name): → def get_user(name: str) -> Optional[User]:.
7. Продвинутый промт: замена глобальных переменных на dependency injection
Задача: Устранить скрытые зависимости через глобальные переменные.
Промт: В этом коде используются глобальные переменные. Перепиши код так, чтобы зависимости передавались через параметры функций или конструкторов (dependency injection). Предложи, как протестировать рефакторинг. Код: [вставка]
Пример результата: DB_HOST уходит из глобальной области, становится параметром DatabaseConnection(host, port).
8. Продвинутый промт: добавление обработки ошибок
Задача: Заменить голые исключения или игнорирование ошибок на осмысленные try-catch.
Промт: Проанализируй этот код на отсутствие обработки ошибок. Добавь try-catch блоки для всех операций, которые могут вызвать исключения (файловый ввод/вывод, сетевые запросы, деление на ноль). Используй конкретные типы исключений, а не общий Exception. Код: [вставка]
Пример результата: Вместо file = open('data.txt') появляется try: file = open('data.txt') except FileNotFoundError: log_error().
9. Продвинутый промт: выделение бизнес-логики из UI
Задача: Разделить слои представления и логики (MVC-рефакторинг).
Промт: В этом коде бизнес-логика смешана с кодом отображения (HTML/консольный вывод). Раздели код на три слоя: модель (данные и логика), представление (вывод) и контроллер (связь). Предложи реализацию на Python/JS. Код: [вставка]
Пример результата: Модель содержит класс Order, представление — OrderView, контроллер — OrderController.
10. Экспертный промт: рефакторинг с учётом SOLID
Задача: Применить принципы SOLID к legacy-классу.
Промт: Примени принципы SOLID к этому классу. Начни с Single Responsibility — разбей, если класс делает слишком много. Затем Open/Closed — сделай класс открытым для расширения. Используй интерфейсы для Dependency Inversion. Напиши пример до и после. Код: [вставка]
Пример результата: Класс ReportGenerator делится на DataFetcher, ReportFormatter, ReportPrinter с интерфейсами.
11. Экспертный промт: рефакторинг с внедрением паттернов проектирования
Задача: Улучшить архитектуру через GoF-паттерны.
Промт: Проанализируй этот код и определи, какие паттерны проектирования (GoF) можно применить для улучшения архитектуры. Предложи конкретные паттерны (Factory, Strategy, Observer) с примерами реализации. Код: [вставка]
Пример результата: Условные операторы заменяются на Strategy Pattern для разных алгоритмов расчёта.
12. Экспертный промт: оптимизация производительности
Задача: Ускорить медленный код без изменения поведения.
Промт: Профилируй этот код на предмет узких мест. Предложи оптимизации: замена циклов на list comprehensions, кэширование результатов, использование генераторов вместо списков, асинхронные вызовы вместо синхронных. Предоставь замеры производительности (теоретические). Код: [вставка]
Пример результата: for i in range(len(data)) → [process(item) for item in data], ускорение в 2-3 раза.
13. Экспертный промт: безопасность и уязвимости legacy-кода
Задача: Найти и исправить уязвимости (SQL-инъекции, XSS, утечки данных).
Промт: Проверь этот код на типовые уязвимости: SQL-инъекции, XSS-атаки, незащищённые пароли, утечки чувствительных данных. Предложи фиксы с использованием параметризованных запросов, экранирования вывода, хеширования паролей. Код: [вставка]
Пример результата: cursor.execute(f"SELECT * FROM users WHERE id = {user_id}") → cursor.execute("SELECT * FROM users WHERE id = ?", (user_id,)).
14. Экспертный промт: интеграция тестов в legacy-проект
Задача: Написать unit-тесты для нетривиального кода.
Промт: Напиши набор unit-тестов для этой функции. Используй pytest (Python) или Jest (JS). Покрой граничные случаи: пустые входные данные, None/null, некорректные типы. Предложи mock для внешних зависимостей. Код: [вставка]
Пример результата: 5-10 тестов с декораторами @pytest.mark.parametrize и mock-объектами для БД.
15. Экспертный промт: автоматическая документация и генерация changelog
Задача: Создать документацию по результатам рефакторинга.
Промт: На основе изменений между старой и новой версией кода сгенерируй документацию: краткое описание изменений, список улучшений, инструкцию по миграции для других разработчиков. Используй формат Markdown. Старый код: [вставка]. Новый код: [вставка]
Пример результата: Файл CHANGELOG.md с разделами «Добавлено», «Изменено», «Удалено».
Заключение
Рефакторинг legacy-кода — это не всегда героическая работа в одиночку. Современные AI-модели могут стать вашим ассистентом: от документирования до внедрения паттернов. Главное — чётко формулировать задачу и проверять результат. Начните с одного промта из списка: выберите самый больной участок кода и примените технику. Если вы работаете в команде, обсудите результаты на code review — AI может предложить нестандартное решение, которое стоит обсудить.
Помните: рефакторинг — это инвестиция в будущее проекта. Каждый час, потраченный на улучшение кода сегодня, сэкономит дни отладки завтра. Используйте промты из этой статьи как стартовую точку, адаптируйте под свой стек и делитесь результатами с коллегами.
Комментарии