| 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 | |
| 26 | 1. **Границы и уведомления** — источники по возможности только публикуют факты (событие, узкая шина, узкий контракт); потребители не тянут друг друга напрямую там, где достаточно реакции на факт. Конкретная механика (event bus, IObservable, медиатор) — по месту. Цель: слабая связность и предсказуемый граф зависимостей. |
| 27 | |
| 28 | 2. **Маршалинг на UI-поток** — см. ADR 0004 (`IUiScheduler` / `UiScheduler.Default`), без размазанного Post/Invoke по коду. |
| 29 | |
| 30 | 3. **Очереди и батчинг (точечно)** — где поток данных перегружает 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 | |