9. Крупный сценарий: метки, переход, ветка, возврат

Стрелка через полкарты не помогает понять сценарий — она его запутывает. Глава про четыре типа, которые позволяют не рисовать такие стрелки вовсе.

Четыре типа вместо длинных связей

Метки
Figure 1. Метка, ветка и переход на одном участке карты
Метка Метка

именованная точка сценария. Вызов, дойдя до неё, идёт дальше как ни в чём не бывало; смысл метки в том, что на неё можно сослаться по имени.

Переход Переход

уводит вызов на метку с указанным именем и не возвращает. Аналог «идти туда и продолжать оттуда».

Ветка Ветка

уводит вызов на метку с возвратом. Отработав, помеченный участок вернёт управление сюда же, и вызов пойдёт дальше по обычной связи.

Возврат Возврат

конец такого участка. Он и возвращает управление тому, кто вызвал ветку.

Метка, переход и ветка связываются не стрелкой, а именем. Поэтому

Связь между переходом и меткой на карте не рисуется. Это не ошибка отрисовки: линия через весь сценарий не сказала бы ничего сверх того, что уже написано именем метки, — а карту бы перечеркнула.

Куда именно уйдёт вызов, видно в свойствах. А найти обе стороны сразу — и метку, и всех, кто на неё ссылается, — проще всего поиском: Ctrl+F и имя метки. Поиск ищет и по значениям свойств, поэтому находит и метку, и каждую ссылку на неё.

Как выглядит вызванный участок

Помеченный участок с возвратом
Figure 2. Ветка save_ctx: метка, работа, возврат

Участок начинается Меткой с именем, дальше идёт обычная цепочка компонентов, а заканчивается Возвратом. Ничего особенного в нём нет: это тот же сценарий, просто у него есть имя и он умеет вернуть управление.

Такие участки принято выносить в отдельный регион и подписывать. Тогда на карте видно, что перед вами не часть основного потока, а «функция», которую вызывают из нескольких мест.

Свойства ветки

Свойства ветки
Figure 3. Свойства компонента «Ветка»
Метка

имя, на которое уходим. Это обычное поле-аргумент (Аргумент): имя можно задать константой, а можно вычислить.

Переменная и Значение

что передать вызываемому участку. Работает как параметр: перед уходом переменной присваивается значение.

Переход

куда идти после возврата. Вот эта связь на карте рисуется — она обычная.

У Перехода (того, что без возврата) свойства те же, кроме последнего: возвращаться некуда, поэтому и ветки «после» у него нет.

Метка, вычисляемая в рантайме

То, что метка задаётся аргументом, — не мелочь, а важная возможность: какая ветка сценария выполнится следующей, можно решать во время выполнения. Одна и та же Ветка позовёт разные участки в зависимости от того, что к этому моменту лежит в переменных.

У этого есть обратная сторона. Если имя метки вычисляется, в редакторе невозможно сказать, куда уйдёт управление: цель зависит от значений, которых на этапе редактирования не существует. Управление может уйти на любую метку сценария.

Такие места стоит подписывать — в описании компонента или в подписи региона: какие значения возможны и какие метки им соответствуют. Иначе разбираться придётся по журналам обработчика.

Когда что применять

Задача Чем решать

Один и тот же кусок нужен из трёх мест

Метка + Ветка: вызвали, отработали, вернулись

Из этой точки вызов должен уйти навсегда — в другой раздел сценария

Метка + Переход

Кусок нужен всего в одном месте

Ничем: обычные связи короче и понятнее

Кусок нужен в другом сценарии

«Запуск сценария» — это уже не метки

Имя метки — просто строка, и редактор не мешает сослаться на несуществующую. Опечатка не подсветится на карте: там ведь и линии нет. Проверяется это поиском по имени метки — если нашлась только ссылка и ни одной метки, переход ведёт в никуда.

Трассировка здесь не помощник: она идёт по связям, а переход по метке связью не является. Путь на таком компоненте просто обрывается — и обрывается одинаково и когда метка есть, и когда её нет.

Чем ещё разгружать карту

  • Регионы и подписи — предыдущая глава. Самое дешёвое, что можно сделать.

  • Говорящие имена. «Проверка рабочего времени» находится поиском, «Сравнение 12» — нет.

  • Раскладка. Одна ветка — одна горизонталь; ошибочные исходы вниз, основной ход вправо. Правило простое, но именно оно делает карту читаемой без единой подписи.

  • Выключение вместо удаления — когда участок временно не нужен.

◀ 8. Регионы

10. Панель инспектора ▶