Джим Арлоу, Айла Нейштадт - UML 2 и Унифицированный процесс. Практический объектно-ориентированный анализ и проектирование (1037782), страница 53
Текст из файла (страница 53)
Например, сообщение, которое возвращает значение некоторого атрибута и не имеетникаких побочных действий, никогда не генерирует изменения состояния. Состояние экземпляров на линиях жизни объектов можнопоказать с помощью инвариантов состояния (state invariants).Добавление инвариантов состояния на диаграмму последовательностей может быть весьма полезным методом анализа, поскольку позволяет фиксировать ключевые состояния жизненного цикла линии жизни. Они отражают важные состояния системы и могут быть основойдля автоматов, обсуждаемых в главе 21.Рассмотрим конкретный пример. На рис.
12.11 показан прецедент изпростой системы обработки заказов, имеющей следующие ограничения:•заказ должен полностью оплачиваться единовременным платежом;•позиции, указанные в заказе, могут поставляться только послеоплаты;Прецедент: ProcessAnOrderID: 5Краткое описание:Покупатель делает заказ, который затем оплачивается и доставляется.Главные актеры:CustomerВторостепенные актеры:Нет.Предусловия:Нет.Основной поток:1. Прецедент начинается, когда актер Customer создает новый заказ.2. Customer полностью оплачивает заказ.3.
Товары доставляются Customer в течение 28 дней после даты окончательного платежа.Постусловия:1. Заказ оплачен.2. Товары доставлены в течение 28 дней после окончательного платежа.Альтернативные потоки:ExcessPaymentOrderCancelledGoodsNotDeliveredGoodsDeliveredLatePartialPaymentРис. 12.11. Спецификация прецедента ProcessAnOrder28112.9. Диаграммы последовательностей•позиции доставляются покупателю в течение 28 дней после оплаты.В реальности процесс обработки заказов обычно намного более сложный и гибкий по сравнению с рассматриваемым примером. Тем не менеепример служит иллюстрацией инвариантов состояний. На рис.
12.12показана диаграмма последовательностей для ProcessAnOrder (обработказаказа).Мы видим, что сразу после создания экземпляр Order переходит в состояние unpaid (не оплачено) (изображается в виде прямоугольника соскругленными углами). Это сообщает о том, что все вновь создаваемыеэкземпляры Order находятся в состоянии unpaid. При получении сообщения acceptPayment() (принять платеж), которое должно обозначать полную оплату, экземпляр переходит в состояние paid (оплачено). Послеэтого экземпляр DeliveryManager (менеджер по доставке) посылает сообщение deliver() (доставить).
Он передает это сообщение экземпляру Order,что приводит к его переходу в состояние delivered (доставлено).Если класс Order также имеет автомат, его состояния должны соответствовать всем инвариантам состояний, присутствующим на его диаграммах последовательностей.Рисунок 12.12 иллюстрирует применение ограничений. Они записываются в фигурных скобках и размещаются на (или рядом) линияхжизни. Ограничение, обозначенное на линии жизни, указывает начтото, что должно быть истинным для экземпляров, начиная с этогомомента и далее. Ограничения часто формулируются на естественномязыке, хотя в UML есть формальный язык ограничений (OCL), который обсуждается в главе 25.На рисунке показано ограничение продолжительности.
Линия жизниобъекта :Customer имеет две метки, A и B, и ограничение {B – A <= 28 days}.sd ProcessAnOrder:OrderManager:DeliveryManager:CustomerraiseOrder()«create»:Orderинвариант состоянияметкаограничениеunpaidAacceptPayment()acceptPayment()paiddeliver(){B – A <= 28 days}delivereddeliver()BРис. 12.12. Диаграмма последовательностей прецедента ProcessAnOrder282Глава 12. Реализация прецедентовЭто говорит о том, что промежуток времени между точками A и B недолжен превышать 28 дней.
Точка A обозначает момент оплаты, а точка B – момент доставки товаров покупателю. На естественном языкеэто ограничение означает, что «заказ должен быть доставлен в течение28 дней после получения платежа».На линию жизни может быть помещен любой тип ограничения. Широко распространены ограничения значений атрибутов экземпляров.И наконец, обратите внимание, что на рис. 12.12 не использовались ниактивации, ни возвраты сообщений. Это объясняется тем, что основное внимание данной диаграммы направлено на сроки и инвариантысостояний, и упомянутые характеристики не добавили бы сюда никакой полезной информации.12.10. Комбинированные фрагменты и операторыДиаграммы последовательностей можно разделить на области, называемые комбинированными фрагментами (combined fragments).
Рис. 12.13иллюстрирует довольно богатый синтаксис комбинированного фрагмента.Комбинированные фрагменты разделяют диаграмму последовательностей на области с различным поведением.У каждого комбинированного фрагмента есть один оператор (operator),один или более операндов (operands) и нуль или более сторожевыхусловий (guard conditions).Оператор определяет, как исполняются его операнды.Оператор определяет, как исполняются его операнды.sd OperatorSyntax:A:B:Ca( )комбинированный фрагментимя оператор [сторожевоеУсловие1]b( )[сторожевоеУсловие2]c( )операндоперандлюбые сторожевые условия должныразмещаться над первым сообщением операндаРис.
12.13. Синтаксис комбинированного фрагмента28312.10. Комбинированные фрагменты и операторыСторожевые условия определяют, будут ли исполняться эти операнды. Сторожевое условие – это логическое выражение, и операнд исполняется тогда и только тогда, когда это выражение истинно. Одно сторожевое условие может применяться ко всем операндам или каждый операнд может иметь собственное уникальное сторожевое условие.Сторожевые условия определяют, будут ли выполняться данные операнды.Полный список операторов приведен в табл.
12.3.Таблица 12.3Оператор Полное имя СемантикаРазделoptoptionaltalternatives Выполняется тот операнд, условие которого 12.10.1истинно. Вместо логического выраженияможет использоваться ключевое слово else(как select … case).looploopЕдинственный операнд выполняется, если 12.10.1условие истинно (как if … then).Имеет специальный синтаксис:12.10.2loop min, max [condition]повторять минимальное количество раз, затем, пока условие истинно, повторять еще(max – min) число раз.breakbreakЕсли сторожевое условие истинно, выполня 12.10.2ется операнд, а не все остальное взаимодействие, в которое он входит.refreferenceКомбинированный фрагмент ссылается на 13.2другое взаимодействие.parparallelВсе операнды выполняются параллельно.criticalcriticalОперанд выполняется автоматически без 20.5.2прерывания.seqweaksequencingВсе операнды выполняются параллельно 12.10при условии выполнения следующего ограничения: последовательность поступлениясобытий на одну линию жизни от разныхоперандов такая же, как и последовательность операндов.В результате наблюдается слабая формаупорядочения; отсюда название (weak sequencing – слабое упорядочение).strictstrictsequencingОперанды выполняются в строгой последо 12.10вательности.20.5.2284Глава 12.
Реализация прецедентовТаблица 12.3 (продолжение)Оператор Полное имя СемантикаРазделnegnegativeОперанд демонстрирует неверные взаимо 12.10действия.Применяется, когда необходимо показать,что не должно произойти.ignoreignoreПеречисляет сообщения, которые намеренно 12.10исключены из взаимодействия. Разделенный запятыми список имен проигнорированных сообщений в фигурных скобках помещается после имени оператора, например {m1,m2, m3}.Например, взаимодействие может представлять тестовый пример, в котором принято решение игнорировать некоторые сообщения.considerconsiderПеречисляет сообщения, намеренно вклю 12.10ченные во взаимодействие.
Разделенный запятыми список имен сообщений в фигурныхскобках помещается после имени оператора.Например, взаимодействие может представлять тестовый пример, в который решеновключить подмножество возможных сообщений.assertassertionОперанд является единственно возможным 12.10допустимым поведением в данный моментвзаимодействия, любое другое поведение было бы ошибочным.Используется как средство обозначения того,что некоторое поведение должно иметь местов определенной точке взаимодействия.Самые важные из них: opt, alt, loop, break, ref, par и critical. Операторыopt, alt, loop и break подробно обсуждаются в следующих подразделах,а ref – в следующей главе. Операторы par и critical имеют отношениек параллелизму, что является вопросом проектирования. Они обсуждаются в разделе 20.5 при рассмотрении параллелизма.
Остальныеоператоры используются редко. В таблице предоставлен достаточныйобъем информации для их применения в случае необходимости.12.10.1. Ветвление с помощью операторов opt и altРисунок 12.14 иллюстрирует синтаксис операторов opt и alt.opt создает единственную ветвь.28512.10. Комбинированные фрагменты и операторыsd OptAndAltSyntax:A:B:C:Dopt [условие]действие()altделать это,если условие истинно[условие1]операнд1()делать это,если условие1 истинно[условие2]операнд2()делать это,если условие 2 истинно[else]операнд3()делать это, если ни одноиз условий не является истиннымРис. 12.14.