Legacy Analyzer
Методический инструментарий диагностики архитектурного состояния
унаследованных программных систем на языках C++ и JavaScript/TypeScript.
Назначение
Инструмент реализует следующий pipeline анализа:
Collector → MetricsEngine → DependencyAnalyzer → DecisionEngine → Reporter
| Модуль |
Ответственность |
Collector |
Обход файловой структуры, идентификация модулей |
MetricsEngine |
CCN, NLOC, число параметров (через lizard) |
DependencyAnalyzer |
Граф зависимостей, coupling_in/out, instability, циклы (через networkx) |
DecisionEngine |
Классификация риска, выбор стратегии модернизации |
Reporter |
Генерация JSON и HTML отчётов |
Установка
pip install lizard networkx
# Опционально — AST-анализ C++ через libclang:
# pip install libclang
# Ubuntu: sudo apt install clang libclang-dev
Использование
# Базовый запуск
python main.py /path/to/your/project
# С кастомными параметрами
python main.py /path/to/project \
--output my_report \
--formats json html \
--ccn-warn 15 \
--ccn-critical 25 \
--verbose
# Только JSON
python main.py /path/to/project --formats json
Программный API
from analyzer import Analyzer
from config import AnalyzerConfig, ThresholdConfig
config = AnalyzerConfig(
output_dir="report",
thresholds=ThresholdConfig(ccn_warn=12, ccn_critical=25),
)
report = Analyzer(config).run("/path/to/project")
print(f"Системный риск: {report.system_risk_level.name}")
print(f"Стратегия: {report.recommended_system_strategy.name}")
for decision in report.decisions[:10]: # Топ-10 проблемных модулей
print(f" {decision.module_name}: {decision.risk_level.name}")
Выходные файлы
После анализа в директории legacy_report/ (или указанной через --output) создаются:
report.json — машинно-читаемый отчёт (для CI/CD)
report.html — человекочитаемый отчёт с таблицами и карточками
Метрики
| Метрика |
Формула / источник |
Порог warn / critical |
| CCN |
McCabe (1976) |
> 10 / > 20 |
| NLOC |
Строк без комментариев |
> 50 / > 100 |
| Параметры функции |
— |
> 5 / > 8 |
| C_out (fan-out) |
Число исходящих рёбер модуля |
> 5 / > 10 |
| C_in (fan-in) |
Число входящих рёбер модуля |
> 10 / > 20 |
| Instability (I) |
C_out / (C_in + C_out), Martin (2018) |
> 0.7 / > 0.9 |
Стратегии модернизации
| Уровень риска |
Стратегия |
Описание |
| LOW |
Оставить |
Модуль в удовлетворительном состоянии |
| MEDIUM |
Рефакторинг |
Локальное улучшение без изменения архитектуры |
| HIGH |
Реинжиниринг |
Перестройка архитектуры с сохранением логики |
| CRITICAL |
Замена |
Полная переработка или замена модуля |
Структура проекта
legacy_analyzer/
├── main.py # CLI точка входа
├── analyzer.py # Главный оркестратор (фасад)
├── config.py # Конфигурация и пороговые значения
├── models.py # Доменные модели данных
├── core/
│ ├── collector.py # Сбор файловой структуры
│ ├── metrics_engine.py # Вычисление метрик
│ └── dependency_analyzer.py # Граф зависимостей
└── reporters/
├── reporter.py # Фасад репортеров
├── json_reporter.py # JSON отчёт
└── html_reporter.py # HTML отчёт