Сценарий 05: Рефакторинг

Сценарий 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]»
  • «Найти длинные функции, которые следует разбить»

Связанные сценарии