Forge
markdowndeeb25a2
1# ADR 0007: Сигналы, слабая связность и снятие нагрузки с UI
2
3**Статус:** Accepted (внедрение — strangler)
4**Дата:** 2026-04-02
5## Связанные ADR
6
7| ADR | Роль |
8|-----|------|
9| [0004](0004-ui-thread-marshaling.md) | Маршалинг обновлений UI через IUiScheduler |
10
11### Вне ADR
12
13| Документ | Роль |
14|----------|------|
15| [architecture-migration.md](../architecture-migration.md) | фаза 5 |
16
17---
18## Контекст
19
20В IDE много источников и потребителей сигналов (сборка, диагностики, MCP, LSP и т.д.). Без правил растёт связность, хаотичные вызовы между подсистемами и ошибки потоков. Большие потоки текста могут перегружать привязки UI.
21
22## Решение
23
24Внедрять поэтапно (strangler), без обязательной смены всего кода сразу:
25
261. **Границы и уведомления** — источники по возможности только публикуют факты (событие, узкая шина, узкий контракт); потребители не тянут друг друга напрямую там, где достаточно реакции на факт. Конкретная механика (event bus, IObservable, медиатор) — по месту. Цель: слабая связность и предсказуемый граф зависимостей.
27
282. **Маршалинг на UI-поток** — см. ADR 0004 (`IUiScheduler` / `UiScheduler.Default`), без размазанного Post/Invoke по коду.
29
303. **Очереди и батчинг (точечно)** — где поток данных перегружает UI (длинный вывод сборки, лавина диагностик): канал или очередь и пакетное обновление VM, чтобы не дергать привязки на каждую строку.
31
32**Паттерны:** listener/pub-sub для топологии много ко многим; producer/consumer для участков с нагрузкой; dispatcher-слой в первую очередь для маршалинга на UI-поток и при необходимости маршрутизации команд, а не замены DI.
33
34## Последствия
35
36Статус по шагам ведётся в [architecture-migration.md](../architecture-migration.md).
37
38## Отклонённые альтернативы
39
40- Вводить тяжёлый глобальный event bus на весь продукт сразу — отклонено в пользу точечных решений и strangler-миграции.
41
View only · write via MCP/CIDE