Сценарий
Определение
Сценарий представлен отдельным объектом, который получает на вход фабрику операций. Подобно операции сценарий не имеет императивного интерфейса, т.к. не предоставляет доступа к своему состоянию и не имеет каких-либо методов в интерфейсе, кроме метода launch
. Метод launch
принимает на вход параметры, описывающие контекст запуска (переменные и/или ключевые сервисы), а также замыкание onFinish
. Таким образом, сценарий похож на обычную функцию: принимает параметры на вход и возвращает результат.
Сценарий обладает собственным жизненным циклом, т.е. может быть запущен на выполнение и оставаться в памяти, даже если вызывающая область видимости уже удалена (асинхронный режим). Сценарий обязательно завершается вызовом коллбека/замыкания onFinish
, переданного ему при запуске. Так гарантируется однозначность выполнения сценария и обеспечивается механизм его удаления. Инициализация сценария выполняется в фабрике сценариев, а запуск – в точке обращения к фабрике. Доступ к фабрике сценариев есть только у некоторых ключевых сервисов, для которых запуск сценариев и обработка результатов их выполнения — это основная зона ответственности.
В ходе выполнения сценарий обращается к фабрике операций для создания операций, после чего снабжает каждую операцию необходимым контекстом и запускает ее на выполнение. Сценарий ожидает завершения текущей операции, обрабатывает результат, после чего переходит к следующей. Также сценарий может обратиться к какому-либо ключевому сервису напрямую, не прибегая к созданию отдельной операции (например, к сервису обработки ошибок). Через прямое обращение к ключевым сервисам реализуется обмен данными между сценариями, а также иницируется запуск других сценариев. Доступ к фабрике сценариев есть только у ключевых сервисов, поэтому сценарий запускать другие сценарии не может.
Если бизнес-требования выражены в виде User Stories, то соответствие требований имеющейся реализации можно проверить, изучая именно код сценарив. Каждая User Story будет выражена в коде одним или несколькими сценариями. Таким образом, сценарии формируют каркас приложения и содержат высокоуровневую бизнес-логику.
Графическое представление
Каждый сценарий может быть описан диаграммой операций.
Совокупность всех сценариев в приложении может быть представлена диаграммой прецедентов. Бытует мнение, что эта диаграмма бесполезна в виду своей тривиальности. В случае ROSS картина меняется: каждый прецедент на диаграмме — это сценарий, т.е. сущность, имеющая непосредственное отображение в код. Кроме того, диаграмма выявляет «источники изменений» или «источники событий» в приложении. На диаграмме они отображены как акторы. Например, в мобильном приложении очевидным актором является пользователь, а менее очевидным может быть сервис сетевого слоя, который при получении 401-й ошибки от бекенда обязан инициировать процесс логаута. Таким образом, процесс логаута фактически инициирует сервер, а не пользователь.
Обмен данными между сценариями
Обмен данными между сценариями выполняется исключительно через ключевые сервисы. Как и операция, сценарий может возвращать результат выполнения в метод в onFinish
, но обрабатывать этот результат все равно будет ключевой сервис, в котором сценарий был запущен.