arch-researcher/README.md
2026-04-27 23:44:22 +05:00

113 lines
5.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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