Пластичность
РОСС состоит из 4-х компонентов: Роутер, Операция, Сценарий и Сервис. Архитектура сформирована таким образом, что любой из компонентов может быть заменен или модифицирован без значимых системных изменений в других компонентах.
Сервисы (как ключевые, так и контекстные) представлены для всех прочих компонентов в виде контрактов (интерфейсов), поэтому легко поддаются независимой модификации. Единственное исключение, где сервисы представлены в виде исходного объекта – это некоторые операции, которые отвечают за инстанцирование и инициализацию ключевых сервисов. Инстанцирование – это создание объекта сервиса и добавление его в контейнер ключевых сервисов. Инициализация может выполняться как в процессе инстанцирования, так и в отдельной операции. Отдельная инициализация может потребоваться как для обхода проблемы циклических зависимостей сервисов, так и для отложенной инициализации особо тяжеловесных сервисов (например, картографической SDK, где требуется прогрев кеша).
Операция инстанцируется исключительно внутри фабрики операций. У фабрики операций есть доступ к контейнеру с ключевыми сервисами, поэтому модификация операции затрагивает только тот метод фабрики, который эту операцию инстанцирует – изменившиеся зависимости в операцию пробрасывать легко. Используется же операция исключительно внутри сценариев, причем операция представлена в сценариях в виде интерфейса с одним или несколькими методами launch. Таким образом, модификация операции не влияет код сценариев, в которых эта операция задействована.
Сценарий также инстанцируется внутри фабрики – фабрики сценариев. Фабрика сценариев имеет доступ к интерфейсу фабрики операций и контейнеру с интерфейсами ключевых сервисов. Каждый метод фабрики сценариев, инстанцирующий сценарий, передает на вход конструктору сценария два параметра: интерфейс фабрики операций и интерфейс AppService. В некоторых случаях также передаются интерфейсы на дополнительные ключевые сервисы, доступа к контейнеру сервисов у сценария нет. Таким образом, сценарий может использовать любые операции, доступные в фабрике операций, а также передавать управление в AppService. Это позволяет модифицировать сценарий, не влияя на задействованные в нем сервисы и операции.
Роутер – это сервис, инкапсулирующий всю UI-логику, включая навигацию и инстанцирование UI-компонентов. Методы в интерфейсе роутера имеют вид «покажи экран с таким-то названием, вот тебе контекст в виде интерфейса вью-модели». Вью-модель выступает в виде связующего звена между роутером и остальными частями приложения, но она порождается внутри операции, и что именно у вью-модели под капотом, роутер не знает. Таким образом, можно свободно модифицировать UI-слой, не затрагивая остальные части приложения. Если потребуется изменить контракт (интерфейс) вью-модели, то это затронет только те операции, где эта вью-модель инстанцируется.