ADR 0006: Слои, вертикальные срезы и роль MainWindowViewModel¶
Статус: Accepted
Дата: 2026-04-02
Связанные ADR¶
Вне ADR¶
| Документ | Роль |
|---|---|
| Features/README.md | Features/README |
| architecture-migration.md | architecture migration |
Контекст¶
Нужна предсказуемая структура одного десктопного приложения (Avalonia + MVVM) без обязательного DDD или hexagonal на весь код, но с явными границами, чтобы не получить неподдерживаемый God ViewModel и не смешивать UI, сценарии и доступ к диску и процессам.
Решение¶
Горизонтальные слои¶
- UI — Views (AXAML), code-behind только для задач представления (
Views/). - Presentation — ViewModels, команды, биндинги (
ViewModels/). - Application / domain logic — сценарии без привязки к Avalonia: парсеры, координация (
Services/, часть). - Infrastructure — файлы, процессы, git, HTTP, MCP-транспорт (
Services/, часть;IdeMcpServer).
Правило: ViewModel не содержит прямых деталей запуска процессов и чтения файлов, если это можно отдать сервису с интерфейсом (или узкому статическому helper с одной ответственностью).
Вертикальные срезы (фичи)¶
Крупная возможность (панель Git, терминал, отладка, чат) оформляется как срез: базово Features/<Имя>/ и неймспейс CascadeIDE.Features.<Имя>; допустимо иное согласованное размещение, главное — единообразие.
Правило: новая нижняя или боковая панель или крупный блок — отдельный *ViewModel, по возможности отдельный *View.
MainWindowViewModel¶
Композитор: создаёт дочерние VM, пробрасывает зависимости, реагирует на события уровня окна (смена решения, закрытие). Допустим мост к MCP.
Не хранить здесь объёмную логику новой фичи (десятки методов git, парсинг путей, поиск решений) — вынос в панельный VM и сервисы.
Модели списков и модули¶
- Модели строк списков (
Models/GitStatusRowи аналоги): данные и флаги для отображения, без тяжёлой бизнес-логики. - Один новый модуль — один понятный корень неймспейса (например
CascadeIDE.Features.Git).
Последствия¶
Новые фичи проектируются по слоям и срезам; перенос старого кода из монолитного VM — постепенно, см. architecture-migration.md.
Отклонённые альтернативы¶
- Вводить полный DDD или обязательный hexagonal на весь код по умолчанию — отклонено как избыточное для текущего масштаба.