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