9. Крупный сценарий: метки, переход, ветка, возврат
Стрелка через полкарты не помогает понять сценарий — она его запутывает. Глава про четыре типа, которые позволяют не рисовать такие стрелки вовсе.
Четыре типа вместо длинных связей
Метка
-
именованная точка сценария. Вызов, дойдя до неё, идёт дальше как ни в чём не бывало; смысл метки в том, что на неё можно сослаться по имени.
Переход
-
уводит вызов на метку с указанным именем и не возвращает. Аналог «идти туда и продолжать оттуда».
Ветка
-
уводит вызов на метку с возвратом. Отработав, помеченный участок вернёт управление сюда же, и вызов пойдёт дальше по обычной связи.
Возврат
-
конец такого участка. Он и возвращает управление тому, кто вызвал ветку.
Метка, переход и ветка связываются не стрелкой, а именем. Поэтому
|
Связь между переходом и меткой на карте не рисуется. Это не ошибка отрисовки: линия через весь сценарий не сказала бы ничего сверх того, что уже написано именем метки, — а карту бы перечеркнула. Куда именно уйдёт вызов, видно в свойствах. А найти обе стороны сразу — и метку, и всех, кто на неё ссылается, — проще всего поиском: Ctrl+F и имя метки. Поиск ищет и по значениям свойств, поэтому находит и метку, и каждую ссылку на неё. |
Как выглядит вызванный участок
save_ctx: метка, работа, возвратУчасток начинается Меткой с именем, дальше идёт обычная цепочка компонентов, а заканчивается Возвратом. Ничего особенного в нём нет: это тот же сценарий, просто у него есть имя и он умеет вернуть управление.
Такие участки принято выносить в отдельный регион и подписывать. Тогда на карте видно, что перед вами не часть основного потока, а «функция», которую вызывают из нескольких мест.
Свойства ветки
- Метка
-
имя, на которое уходим. Это обычное поле-аргумент (Аргумент): имя можно задать константой, а можно вычислить.
- Переменная и Значение
-
что передать вызываемому участку. Работает как параметр: перед уходом переменной присваивается значение.
- Переход
-
куда идти после возврата. Вот эта связь на карте рисуется — она обычная.
У Перехода (того, что без возврата) свойства те же, кроме последнего: возвращаться некуда, поэтому и ветки «после» у него нет.
Метка, вычисляемая в рантайме
То, что метка задаётся аргументом, — не мелочь, а важная возможность: какая ветка сценария выполнится следующей, можно решать во время выполнения. Одна и та же Ветка позовёт разные участки в зависимости от того, что к этому моменту лежит в переменных.
|
У этого есть обратная сторона. Если имя метки вычисляется, в редакторе невозможно сказать, куда уйдёт управление: цель зависит от значений, которых на этапе редактирования не существует. Управление может уйти на любую метку сценария. Такие места стоит подписывать — в описании компонента или в подписи региона: какие значения возможны и какие метки им соответствуют. Иначе разбираться придётся по журналам обработчика. |
Когда что применять
| Задача | Чем решать |
|---|---|
Один и тот же кусок нужен из трёх мест |
Метка + Ветка: вызвали, отработали, вернулись |
Из этой точки вызов должен уйти навсегда — в другой раздел сценария |
Метка + Переход |
Кусок нужен всего в одном месте |
Ничем: обычные связи короче и понятнее |
Кусок нужен в другом сценарии |
«Запуск сценария» — это уже не метки |
|
Имя метки — просто строка, и редактор не мешает сослаться на несуществующую. Опечатка не подсветится на карте: там ведь и линии нет. Проверяется это поиском по имени метки — если нашлась только ссылка и ни одной метки, переход ведёт в никуда. Трассировка здесь не помощник: она идёт по связям, а переход по метке связью не является. Путь на таком компоненте просто обрывается — и обрывается одинаково и когда метка есть, и когда её нет. |
Чем ещё разгружать карту
-
Регионы и подписи — предыдущая глава. Самое дешёвое, что можно сделать.
-
Говорящие имена. «Проверка рабочего времени» находится поиском, «Сравнение 12» — нет.
-
Раскладка. Одна ветка — одна горизонталь; ошибочные исходы вниз, основной ход вправо. Правило простое, но именно оно делает карту читаемой без единой подписи.
-
Выключение вместо удаления — когда участок временно не нужен.