Перейти к содержанию

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 на весь код по умолчанию — отклонено как избыточное для текущего масштаба.