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