20.5. Моделирование параллелизма 457
• Раздел critical представляет атомарное поведение, которое не может
быть прервано. Это важное уточнение, поскольку вызов пожарного
датчика является критически важным для безопасности и не может
быть прерван.
• Оба цикла (loop) имеют семантику Repeat...Until (повторять ... пока) –
они выполняются один раз, чтобы задать значение переменной, ис
пользуемой в их условиях, и затем повторяются до тех пор, пока их
условия остаются истинными.
• Пожарная тревога всегда должна иметь больший приоритет по от
ношению к тревоге вторжения. Поэтому loop в операнде 2 оператора
par прерывается событием fire() или intruder(). Зачем продолжать от
слеживание вторжений во время пожара! Более того, сигнал трево
ги вторжения воспроизводится только в случае отсутствия пожар
ной тревоги.
Еще хочется отметить, что на этой диаграмме показан только один Fire
Sensor (пожарный датчик) и один SecuritySensor (датчик безопасности).
Конечно, этого достаточно для иллюстрации поведения, но, возможно,
вам захочется показать итерацию системы по нескольким датчикам
SecuritySensor и нескольким FireSensor. Для этого придется изменить диа
грамму так, как показано на рис. 20.10, и ввести еще два внутренних
цикла для прохода по коллекции датчиков.
Оба операнда на рис. 20.10 с точки зрения цикла ведут себя одинако
во, поэтому в качестве примера был выбран верхний из них, который
отслеживает FireSensor.
Как видите, внешний цикл остался неизменным. А новый внутренний
цикл по очереди перебирает все датчики FireSensor. Это можно показать
с помощью выражения цикла:
[for each f in FireSensor]
Тогда селектор [f] может использоваться для обозначения на диаграмме
последовательностей FireSensor, выбранного циклом в качестве линии
жизни, и ему может быть отправлено сообщение isTriggered(). В этом цик
ле есть комбинированный фрагмент break, который прерывает внут
ренний цикл и выполняет свой операнд, когда fire принимает значение
true. При этом, как и ранее, мы попадаем в критическую секцию.
Важно сохранять максимальную простоту диаграмм последовательно
стей. Основное внимание в реализации прецедента должно быть на
правлено на иллюстрацию возможных взаимодействий классов при
реализации описанного прецедентом поведения. Для данного примера
прецедента ActivateAll диаграммы, показанной на рис. 20.9, вероятно,
достаточно для представления основного поведения системы, особенно
если снабдить ее несколькими комментариями. А рис. 20.10 всетаки
слишком подробный.