Сценарий 05: Рефакторинг¶
Старший разработчик выявляет возможности для улучшения кода.
Быстрый старт¶
# Выберите сценарий рефакторинга
/select 05
Поиск возможностей для рефакторинга¶
Функции с высокой сложностью¶
> Найти функции с цикломатической сложностью выше 20
╭─────────────── Анализ сложности ────────────────────────────╮
│ │
│ Функции, превышающие порог (сложность > 20): │
│ │
│ 🔴 exec_simple_query() сложность: 47 │
│ Расположение: src/backend/tcop/postgres.c:890 │
│ Рекомендация: Выделить аутентификацию, разбор │
│ и выполнение в отдельные функции │
│ │
│ 🟡 ExecInitNode() сложность: 32 │
│ Расположение: src/backend/executor/execProcnode.c:156 │
│ Рекомендация: Использовать таблицу диспетчеризации │
│ вместо оператора switch │
│ │
│ 🟡 parse_analyze() сложность: 28 │
│ Расположение: src/backend/parser/analyze.c:102 │
│ Рекомендация: Выделить обработчики, специфичные для │
│ операторов │
│ │
│ Всего: 23 функции превышают порог │
│ │
╰──────────────────────────────────────────────────────────────╯
Обнаружение неиспользуемого кода¶
> Найти неиспользуемые статические функции
╭─────────────── Анализ мёртвого кода ────────────────────────╮
│ │
│ Неиспользуемые статические функции (вызовы не найдены): │
│ │
│ src/backend/utils/misc/help.c: │
│ - old_format_help() Строки: 45-89 │
│ - legacy_usage_message() Строки: 123-156 │
│ │
│ src/backend/catalog/pg_type.c: │
│ - deprecated_type_check() Строки: 789-834 │
│ │
│ Уверенность: ВЫСОКАЯ (статические функции, нет внешних ссылок) │
│ Рекомендация: Можно безопасно удалить после проверки │
│ │
╰──────────────────────────────────────────────────────────────╯
Дублирование кода¶
> Найти повторяющиеся фрагменты кода
╭─────────────── Обнаружение клонов ──────────────────────────╮
│ │
│ Кластеры дублирующегося кода: │
│ │
│ Кластер №1 (сходство 95%, 34 строки): │
│ - src/backend/access/heap/heapam.c:1234-1267 │
│ - src/backend/access/heap/heapam.c:1890-1923 │
│ Рекомендация: Выделить общую логику в вспомогательную функцию │
│ │
│ Кластер №2 (сходство 88%, 22 строки): │
│ - src/backend/executor/nodeSeqscan.c:45-66 │
│ - src/backend/executor/nodeIndexscan.c:78-99 │
│ - src/backend/executor/nodeBitmapscan.c:89-110 │
│ Рекомендация: Создать общую подпрограмму инициализации сканирования │
│ │
│ Всего клонов: 15 кластеров │
│ Дублируемых строк: ~450 │
│ │
╰──────────────────────────────────────────────────────────────╯
Планирование рефакторинга¶
Возможности выделения методов¶
> Найти возможности выделения методов в exec_simple_query
╭─────────────── Анализ выделения методов ────────────────────╮
│ │
│ Функция: exec_simple_query() │
│ Текущее количество строк: 234 │
│ │
│ Предлагаемые выделения: │
│ │
│ 1. Строки 45-78: Обработка аутентификации │
│ Предлагаемое имя: check_query_authorization() │
│ Параметры: query_string, session_state │
│ │
│ 2. Строки 89-134: Разбор запроса │
│ Предлагаемое имя: parse_and_analyze_query() │
│ Параметры: query_string │
│ Возвращает: ParsedQuery │
│ │
│ 3. Строки 156-198: Генерация плана │
│ Предлагаемое имя: generate_query_plan() │
│ Параметры: analyzed_query │
│ Возвращает: PlannedQuery │
│ │
│ Эффект: Снижение сложности с 47 до ~12 на функцию │
│ │
╰──────────────────────────────────────────────────────────────╯
Анализ влияния изменений¶
> Какие компоненты затронет рефакторинг heap_insert?
╭─────────────── Анализ влияния ──────────────────────────────╮
│ │
│ Целевая функция: heap_insert() │
│ Прямые вызывающие: 23 │
│ Транзитивные вызывающие: 156 │
│ │
│ Затрагиваемые подсистемы: │
│ - Исполнитель (12 вызовов) │
│ - Команда COPY (3 вызова) │
│ - Выполнение триггеров (4 вызова) │
│ - Обёртка внешних данных (4 вызова) │
│ │
│ Файлы тестов, требующие обновления: │
│ - regress/sql/insert.sql │
│ - regress/sql/copy.sql │
│ - regress/sql/triggers.sql │
│ │
│ Уровень риска: ВЫСОКИЙ (ключевая функция) │
│ │
╰──────────────────────────────────────────────────────────────╯
Примеры запросов¶
- «Найти функции с высокой сложностью»
- «Показать повторяющиеся фрагменты кода»
- «Найти неиспользуемый код в [модуле]»
- «Какие компоненты затронет изменение [функции]?»
- «Предложи рефакторинг для [function_name]»
- «Найти длинные функции, которые следует разбить»
Связанные сценарии¶
- Производительность — Рефакторинг для повышения производительности
- Технический долг — Оценка технического долга
- Массовый рефакторинг — Масштабные изменения
- Код-ревью — Проверка изменений после рефакторинга