arch-researcher/README.md

113 lines
5.2 KiB
Markdown
Raw Normal View History

2026-04-27 18:44:22 +00:00
# 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 отчёт
```