Я моделирую цикл в диаграмме активности UML. Он хорошо работает с узлами простого состояния (диаграмма 1), но я ищу более выразительный способ подчеркнуть семантический цикл цикла.
Поэтому я пришел в “регионы” или “прерываемые регионы”, которые показаны здесь и там, но я не смог найти много действительно удовлетворяющих примеров.
Мой пример – это функция, которая обрабатывает сообщения определенного списка. Цикл прерывается, как только будет найдено первое правильное сообщение, тогда сообщение обрабатывается, и функция возвращает true. В противном случае он возвращает false (пожалуйста, никаких комментариев о смысле или глупости, это только для образца).
Диаграмма 1: использует старую условную условную схему node. По правде говоря, легче контролировать поток управления по стрелкам, но нет “ЛОП”, есть только “если”.
Диаграмма 2:
- (положительное) условие выхода корректно, используя прерывистый край? Правда, он может быть частью секции [test] цикла вместе с итератором.
- BTW: как итерационный символ для петли, наилучшим образом выраженный в UML?
- Правильно ли выполняется действие final node внутри тела цикла (т.е. когда условное “сообщение действительное?” дает “нет” )? Как-то неправильно использовать конечный node здесь, но как еще я могу выразить поток управления одним циклом?
Функциональность обеих диаграмм должна быть эквивалентной:
Изменить: еще одна диаграмма, которая реализует предложения от Steph:
- Начальный и конечный node внутри тела цикла
- “дальнейшая обработка” теперь находится внутри тела цикла. Ну… ОК здесь, но могут быть и другие циклы, где я бы предпочел бы это снаружи. Тогда я мог бы изменить дизайн в любом случае…
- “Следующее сообщение” также можно рассматривать как сам объект итератора вместо действия “(предоставить) следующее сообщение” из исходной диаграммы.
- Две стрелки потока объектов могут быть немного переполнены, но я думаю, что они верны.
В UML окончание активности node представляет собой завершение, поэтому оно корректно в области цикла, когда вы его используете, это нормальное завершение содержимого вашего цикла (что по очереди приводит к следующей итерации), В качестве примечания я также советую использовать начальный node для начала вашего цикла.
И есть также окончательный поток node, который представляет собой выход, а не завершение. Таким образом, вы можете использовать его для представления оператора “break” вместо используемого прерывания. В этом случае вам необходимо интегрировать “дальнейшую обработку сообщений node” в ветке “да”, как раз перед окончанием потока node.
Прерывающий край скорее для прерываний, поступающих извне текущей обработки. Область прерывается, и некоторые события (обычно отмеченные узлами приема) могут полностью прервать ее независимо от прогресса в содержании региона. Здесь это не так.
Что касается итерирующего персонажа, то, к сожалению, нет ничего очень визуального. Я обычно использую объект node поверх области, рядом с начальным node.