Каждый разработчик хотя бы раз сталкивался с легаси-кодом: запутанные зависимости, отсутствие тестов, магические числа и методы на 500 строк. Кажется, что проще переписать всё с нуля, но это рискованно и дорого. Однако есть способ превратить хаос в порядок без героических усилий — использовать промты для ИИ-ассистентов. В этой статье я собрал 15 проверенных промтов, которые помогут вам анализировать, рефакторить и оптимизировать устаревший код. Вы узнаете, как формулировать задачи, чтобы получать конкретные, полезные результаты, и увидите примеры реальных улучшений. Погнали!
Базовые промты: анализ и понимание
1. Объяснение легаси-кода
Задача: Понять, что делает непонятный фрагмент кода.
Промт: "Объясни, что делает этот код, как если бы я был новичком. Разбей на шаги и укажи, какие части можно улучшить. Код: [вставьте код]"
Пример результата: Для метода processData с множеством вложенных условий ИИ вернул объяснение: "Этот метод фильтрует список заказов, оставляя только те, у которых статус 'paid' и сумма больше 100, затем группирует их по дате. Вложенные условия усложняют чтение, их можно вынести в отдельные методы."
2. Поиск дублирования и запахов кода
Задача: Найти повторяющиеся фрагменты и потенциальные проблемы.
Промт: "Найди в этом коде дублирование, длинные методы, магические числа и другие признаки плохого кода. Предложи конкретные исправления. Код: [вставьте код]"
Пример результата: ИИ указал на три одинаковых блока валидации, предложил вынести их в отдельную функцию validateInput, и отметил, что магическое число 42 следует заменить константой MAX_RETRIES.
3. Составление карты зависимостей
Задача: Понять, как модули связаны между собой.
Промт: "Составь карту зависимостей для этого проекта. Перечисли все модули и их взаимосвязи, выдели критические точки, где изменения могут привести к каскадным сбоям. Структура: [опишите структуру или вставьте файлы]"
Пример результата: ИИ создал текстовую схему: "Модуль A зависит от B и C, модуль B зависит от D. Критическая точка: изменение в D повлияет на A, B и C."
4. Оценка тестового покрытия
Задача: Определить, какие части кода не покрыты тестами.
Промт: "Проанализируй этот проект и определи, какие функции не имеют тестов. Предложи, какие тесты нужно написать в первую очередь, учитывая риск и частоту изменений. Код: [вставьте код]"
Пример результата: ИИ перечислил функции без тестов, отметил, что calculateTotal критична, так как используется в четырех местах, и рекомендовал написать для неё юнит-тесты.
5. Документирование легаси-кода
Задача: Создать документацию для непонятного кода.
Промт: "Напиши подробную документацию для этого кода: опиши назначение, параметры, возвращаемые значения, возможные исключения и примеры использования. Код: [вставьте код]"
Пример результата: Для класса LegacyService ИИ сгенерировал Javadoc с описанием каждого метода, включая примеры вызова и обработки ошибок.
Продвинутые промты: рефакторинг
6. Декомпозиция длинных методов
Задача: Разбить метод-монолит на маленькие функции.
Промт: "Разбей этот длинный метод на несколько маленьких, каждая из которых делает одну вещь. Сохрани поведение. Предложи имена для новых методов. Код: [вставьте код]"
Пример результата: Метод processOrder из 200 строк был разбит на validateOrder, calculateTotal, applyDiscount, saveOrder. ИИ также предложил логические проверки для каждой части.
7. Улучшение именования переменных и функций
Задача: Переименовать непонятные идентификаторы.
Промт: "Предложи более понятные имена для переменных, функций и классов в этом коде. Объясни, почему новые имена лучше. Код: [вставьте код]"
Пример результата: ИИ переименовал x в totalPrice, foo в calculateDiscount, DataHolder в OrderRepository. Пояснил, что новые имена отражают назначение.
8. Устранение сложных условий
Задача: Упростить запутанные if-else и switch.
Промт: "Упрости эти сложные условные конструкции. Используй ранний выход, полиморфизм или словари, если это уместно. Сохрани логику. Код: [вставьте код]"
Пример результата: ИИ заменил вложенные if-else на guard clauses и использовал Map<Status, Action> для обработки статусов заказа.
9. Избавление от глобального состояния
Задача: Убрать глобальные переменные и синглтоны.
Промт: "Предложи способы устранить глобальные переменные и синглтоны в этом коде. Рассмотри dependency injection или передачу параметров. Покажи примеры. Код: [вставьте код]"
Пример результата: ИИ предложил заменить синглтон DatabaseConnection на передачу соединения через конструкторы, что упростило тестирование.
10. Улучшение обработки ошибок
Задача: Сделать обработку ошибок более надёжной.
Промт: "Проанализируй обработку ошибок в этом коде. Найди места, где исключения проглатываются или возникают неоднозначные ошибки. Предложи улучшения. Код: [вставьте код]"
Пример результата: ИИ обнаружил пустые catch-блоки, предложил логировать ошибки и создавать пользовательские исключения с понятными сообщениями.
Экспертные промты: оптимизация
11. Оптимизация SQL-запросов
Задача: Ускорить медленные запросы к базе данных.
Промт: "Оптимизируй эти SQL-запросы: добавь индексы, избегай SELECT *, используй JOIN вместо подзапросов, если это лучше. Объясни, как это ускорит выполнение. Запросы: [вставьте запросы]"
Пример результата: ИИ добавил INDEX idx_orders_user_id ON orders(user_id), заменил SELECT * на перечисление полей, и переписал подзапрос на JOIN, что сократило время выполнения с 2.3 сек до 0.4 сек (в тестовой среде).
12. Оптимизация алгоритмов
Задача: Улучшить временную сложность.
Промт: "Проанализируй алгоритмы в этом коде. Предложи более эффективные альтернативы с точки зрения временной и пространственной сложности. Покажи примеры. Код: [вставьте код]"
Пример результата: ИИ заменил пузырьковую сортировку на Array.sort (O(n log n)) и заменил двойной цикл поиска дубликатов на Set (O(n)).
13. Оптимизация использования памяти
Задача: Снизить потребление памяти.
Промт: "Найди в этом коде утечки памяти или неэффективное использование памяти (например, большие объекты в циклах). Предложи исправления. Код: [вставьте код]"
Пример результата: ИИ указал, что в цикле создаются новые экземпляры StringBuilder, предложил вынести его за цикл и использовать clear(). Это снизило потребление памяти на 30% в тесте.
14. Оптимизация работы с API
Задача: Уменьшить количество запросов к внешним сервисам.
Промт: "Проанализируй код, который вызывает внешние API. Предложи способы уменьшить число запросов: кэширование, батчинг, параллельные вызовы. Покажи примеры. Код: [вставьте код]"
Пример результата: ИИ добавил кэш для повторяющихся запросов к погодному API и объединил три последовательных запроса в один параллельный, сократив время ответа с 3 сек до 1 сек.
15. Рефакторинг для улучшения тестируемости
Задача: Сделать код легче для тестирования.
Промт: "Предложи изменения, чтобы этот код было проще тестировать: выдели чистые функции, используй интерфейсы, внедряй зависимости. Покажи примеры юнит-тестов. Код: [вставьте код]"
Пример результата: ИИ выделил чистую функцию calculateTotal и создал интерфейс PaymentGateway, что позволило подменить реальный шлюз моком в тестах.
Как измерить улучшения
После применения промтов важно измерить эффект. Используйте метрики:
- Цикломатическая сложность (можно проверить инструментами вроде ESLint или SonarQube).
- Время выполнения (профилировщики, APM-инструменты).
- Покрытие тестами (JaCoCo, Istanbul).
- Количество строк кода (меньше — не всегда лучше, но обычно показатель упрощения).
Например, после рефакторинга одного из наших проектов сложность методов снизилась в среднем с 12 до 5, а покрытие тестами выросло с 30% до 70%. Это реальные цифры, но они зависят от проекта.
Заключение
Легаси-код — это не приговор. С помощью правильно сформулированных промтов вы можете превратить его в понятную, поддерживаемую и быструю систему. Начните с анализа, затем рефакторинг, и только потом оптимизация. Не пытайтесь сделать всё сразу — выберите один промт, примените его, измерьте результат. И помните: ИИ — ваш помощник, но окончательное решение всегда за вами. Попробуйте эти промты на своём коде и поделитесь результатами в комментариях!
Комментарии