113 lines
5.2 KiB
Markdown
113 lines
5.2 KiB
Markdown
|
|
# 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 отчётов |
|
|||
|
|
|
|||
|
|
## Установка
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
pip install lizard networkx
|
|||
|
|
# Опционально — AST-анализ C++ через libclang:
|
|||
|
|
# pip install libclang
|
|||
|
|
# Ubuntu: sudo apt install clang libclang-dev
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Использование
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# Базовый запуск
|
|||
|
|
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
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
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 отчёт
|
|||
|
|
```
|