Сценарий 13: Массовая рефакторизация

Сценарий 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/шаблона]»
  • «Показать зависимости для рефакторизации»
  • «Создать скрипт изменений для [шаблона]»
  • «Оценить риски масштабной рефакторизации»
  • «Создать план отката»
  • «Разделить рефакторизацию на фазы»