5.2 KiB
5.2 KiB
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 отчёт