Сценарий 13: Массовая рефакторизация¶
Руководитель технической группы планирует и координирует масштабные изменения в коде.
Содержание¶
- Быстрый старт
- Анализ области
- Определение объема рефакторинга
- Анализ зависимостей
- Планирование изменений
- Создание плана рефакторинга
- Генерация скрипта изменений
- Управление рисками
- Оценка воздействия
- Планирование отката
- Примеры вопросов
- Связанные сценарии
Быстрый старт¶
# Выберите сценарий массовой рефакторинга
/select 13
Анализ области работ¶
Определение объема рефакторинга¶
> Планирование массового рефакторинга функций выделения памяти
╭─────────────── Анализ области работ ──────────────────────────────╮
│ │
│ Цель рефакторинга: API выделения памяти │
│ │
│ Затронутые функции: │
│ palloc() 89 вызовов в 45 файлах │
│ palloc0() 67 вызовов в 38 файлах │
│ repalloc() 34 вызова в 22 файлах │
│ pfree() 112 вызовов в 52 файлах │
│ │
│ Общее влияние: │
│ Затронутые файлы: 78 │
│ Строки для изменения: ~450 │
│ Подсистемы: 12 │
│ │
│ Оценка рисков: ВЫСОКАЯ │
│ - Критическая функциональность │
│ - Широкое использование │
│ - Высокая зависимость от производительности │
│ │
╰───────────────────────────────────────────────────────────────────╯
Анализ зависимостей¶
> Показать зависимости для массового рефакторинга
╭─────────────── Граф зависимостей ────────────────────────────╮
│ │
│ Порядок рефакторинга (по зависимостям): │
│ │
│ Этап 1: Ядро (без зависимостей) │
│ └── mcxt.c (основа контекста памяти) │
│ │
│ Этап 2: Низкоуровневые (зависят от Этапа 1) │
│ ├── aset.c (набор выделения памяти) │
│ ├── generation.c (контекст поколения) │
│ └── slab.c (аллокатор слэбов) │
│ │
│ Этап 3: Вспомогательные (зависят от Этапа 2) │
│ ├── stringinfo.c │
│ ├── psprintf.c │
│ └── palloc_extended.c │
│ │
│ Этап 4: Потребители (зависят от всего вышеперечисленного) │
│ └── [78 файлов-потребителей] │
│ │
╰──────────────────────────────────────────────────────────────╯
Планирование изменений¶
Создание плана рефакторинга¶
> Создать план рефакторинга с задачами
╭─────────────── План рефакторинга ────────────────────────────╮
│ │
│ Массовый рефакторинг: Модернизация API управления памятью │
│ │
│ Задача 1: Обновление основного интерфейса │
│ Файлы: src/backend/utils/mmgr/mcxt.c │
│ Изменения: Добавление новых функций API │
│ Тесты: Модульные тесты для новых функций │
│ │
│ Задача 2: Создание слоя совместимости │
│ Файлы: src/include/utils/palloc.h │
│ Изменения: Макро-обёртки для старого API │
│ Тесты: Проверка обратной совместимости │
│ │
│ Задача 3: Обновление модуля исполнителя │
│ Файлы: 12 файлов в директории executor/ │
│ Изменения: Переход на новое API │
│ Тесты: Регрессионные тесты │
│ │
│ Задача 4: Обновление модуля хранения │
│ Файлы: 8 файлов в директории storage/ │
│ Изменения: Переход на новое API │
│ Тесты: Регрессионные тесты │
│ │
│ [... ещё 6 фаз ...] │
│ │
│ Всего задач: 10 │
│ Параллельные потоки: 3 (после фазы 2) │
│ │
╰──────────────────────────────────────────────────────────────╯
Генерация скрипта изменений¶
> Сгенерировать команды sed для миграции API
╭─────────────── Скрипт изменений ─────────────────────────────╮
│ │
│ Автоматизированные команды рефакторинга: │
│ │
│ # Шаг 1: Простые замены │
│ find . -name "*.c" -exec sed -i \ │
│ 's/palloc(\([^)]*\))/palloc_new(\1)/g' {} \; │
│ │
│ # Шаг 2: Шаблоны с обработкой ошибок │
│ # Требуется ручная проверка │
│ grep -rn "palloc.*;" | grep -v "if.*palloc" │
│ │
│ # Шаг 3: Проверка изменений │
│ git diff --stat │
│ │
│ Предупреждение: некоторые шаблоны требуют ручной проверки: │
│ - Условные выделения памяти │
│ - Раскрытие макросов │
│ - Шаблоны обработки ошибок │
│ │
╰──────────────────────────────────────────────────────────────╯
Управление рисками¶
Оценка воздействия¶
> Оценка риска масштабной рефакторизации
╭─────────────── Оценка рисков ─────────────────────────────╮
│ │
│ Матрица рисков: │
│ │
│ 🔴 Области высокого риска: │
│ - Путь фиксации транзакций (критично для производительности) │
│ - Управление буферами (целостность данных) │
│ - Диспетчер блокировок (потенциал взаимоблокировок) │
│ │
│ 🟡 Области среднего риска: │
│ - Исполнители операций (покрыты тестами) │
│ - Операции с каталогом (обратимы) │
│ │
│ 🟢 Области низкого риска: │
│ - Вспомогательные функции (изолированы) │
│ - Модули contrib (опциональны) │
│ │
│ Стратегии снижения рисков: │
│ 1. Флаги функций для постепенного внедрения │
│ 2. Полное покрытие тестами перед внесением изменений │
│ 3. План отката для каждого этапа │
│ │
╰───────────────────────────────────────────────────────────╯
Планирование отката¶
> Создание плана отката
╭─────────────── План отката ──────────────────────────────╮
│ │
│ Процедуры отката по этапам: │
│ │
│ Откат этапа 1: │
│ git revert <commit-hash> │
│ Риск: Отсутствует (только изменения ядра) │
│ │
│ Откат этапа 2: │
│ git revert <commit-range> │
│ Дополнительно: Пересборка слоя совместимости │
│ │
│ Откат этапа 3 и далее: │
│ git revert <commit-range> │
│ Дополнительно: Запуск регрессионного набора тестов │
│ Внимание: Может потребоваться миграция данных │
│ │
│ Точка невозврата: После этапа 7 │
│ (Слой совместимости удалён) │
│ │
╰──────────────────────────────────────────────────────────╯
Примеры вопросов¶
- «Запланировать масштабную рефакторизацию [API/шаблона]»
- «Показать зависимости для рефакторизации»
- «Создать скрипт изменений для [шаблона]»
- «Оценить риски масштабной рефакторизации»
- «Создать план отката»
- «Разделить рефакторизацию на фазы»
Связанные сценарии¶
- Рефакторинг — Рефакторинг отдельной функции
- Межрепозиториевые изменения — Изменения в нескольких репозиториях
- Технический долг — Рефакторинг, обусловленный техническим долгом
- Код-ревью — Проверка массовых изменений