Сравнительный анализ

Сравнительный анализ

Традиционные MV*-архитектуры (MVC, MPV, MVVM и т.п.) объединяет общее свойство: они описывают один экран либо группу экранов, т.е. взаимодействие сущностей между элементами одного модуля. MV*-архитектуры не затрагивают вопросы межмодульного взаимодействия, такие как:

  • кто инстанцирует модуль и запускает его на выполнение?
  • куда передается поток управления от модуля, завершившего работу?
  • кто отвечает за обработку общих для всех модулей ошибок?
  • кто обслуживает обработку deeplinks (т.е. переход в произвольную часть навигации)?
  • кто отвечает за процесс логаута (очистку кеша, завершение фоновых процессов)?

Традиционно подобные задачи ложатся на плечи какого-нибудь координатора, в итоге мы получаем «MVVM c координаторами» или «VIPER с шиной данных». Что именно кроется под выбранным словосочетаниям известно только команде разработчиков, которая его выбрала, потому что в конечном итоге решение неминуемо модифицируется под возможности и потребности конкретной команды.

Ключевая задача ROSS состоит в том, чтобы перейти от «перекладывания ответственностями между буковками» в рамках одного модуля к описанию UserFlow целиком. Подобную задачу призваны решить UDF-архитектуры, но их ключевое преимущество в виде единого State является же и ахиллесовой пятой. Единый State не масштабируется: начинаются сложности с синхронизацией различных кешей, игнорируется наличие UI-state (анимации, например), невозможно откатить цепочку изменений в рамках неудачного сценария.

Ключевые особенности ROSS:

  • полная инкапсуляция UI-слоя, разделение UI-логики и бизнес-логики;
  • прямое отображение UserFlow в программную сущность (сценарий);
  • state приложения распределен между совокупностью независимых сервисов.