Джим Арлоу, Айла Нейштадт - UML 2 и Унифицированный процесс. Практический объектно-ориентированный анализ и проектирование (1037782), страница 54
Текст из файла (страница 54)
Синтаксис операторов opt и altОператор opt показывает, что его единственный операнд выполняется,если сторожевое условие истинно. В противном случае выполнениепродолжается после комбинированного фрагмента.opt эквивалентен программной конструкции:if (условие1) thenдействие1alt создает несколько ветвей.Оператор alt предоставляет выбор между рядом альтернатив. Каждыйиз его операндов имеет собственное сторожевое условие и будет выполняться, если только условие истинно.
Необязательный операнд, заданный сторожевым условием [else], выполняется, если ни одно из другихсторожевых условий не является истинным.Это означает, что выполняться может только один из операндов alt,т. е. сторожевые условия всех операндов должны быть взаимоисключающими. Истинность более одного из сторожевых условий в любоймомент времени является условием возникновения ошибки.
Спецификация UML не описывает поведение alt в этом случае.alt эквивалентен программной конструкции:if (условие1) thenоперанд 1else if (условие2) thenоперанд 2286Глава 12. Реализация прецедентовПрецедент: ManageBasketID: 2Краткое описание:Покупатель меняет количество товарных позиций в корзине.Главные актеры:CustomerВторостепенные актеры:Нет.Предусловия:1. Содержимое корзины для покупок является видимым.Основной поток:1. Прецедент начинается, когда Customer выбирает товарную позицию в корзине.2. Если Customer выбирает «delete item»2.1. Система удаляет позицию из корзины.3. Если Покупатель вводит новое количество3.1. Система обновляет количество товаров в корзине.Постусловия:Нет.Альтернативные потоки:Нет.Рис. 12.15.
Спецификация прецедента ManageBasket...else if (условиеN) thenоперанд Nelseоперанд MКак видите, оператор opt семантически эквивалентен оператору altс одним операндом.В качестве примера использования opt и alt рассмотрим прецедентна рис. 12.15. Впервые прецедент ManageBasket был показан в разделе 4.5.6. Это часть простой системы электронной коммерции.
Он описывает процесс обновления количества объектов определенной товарной позиции или полного удаления этой позиции из корзины для покупок (ShoppingBasket) покупателя (Customer).На рис. 12.16 показана диаграмма классов анализа этого прецедента.Как видите, в ShoppingBasket находится один или более Item. Каждыйиз этих Item – это quantity (количество) конкретного Product. На диаграмме классов анализа показывают только классы, атрибуты и операции,иллюстрирующие моделируемый момент. На данной диаграмме мыпытаемся показать совместную работу ShoppingBasket, Item и Product.И наконец, на рис. 12.17 показана диаграмма последовательностей,реализующая этот прецедент. Обратите внимание, что на данной диаграмме описана стратегия, согласно которой Item уничтожается, когдаего quantity достигает нуля. Это вполне обоснованно, поскольку Item существует только для того, чтобы представлять quantity конкретного28712.10.
Комбинированные фрагменты и операторыManageBasketShoppingBasket10..*getItem():Item0..*Item0..*quantity:intProductproductId:Stringname:Stringdescription:Stringprice:doublesetQuantity():intРис. 12.16. Диаграмма классов анализа прецедента ManageBasketsd ManageBasket:ShoppingBasket:Customeritem:ItemgetItem()alt[changeQuantity]setQuantity()opt[ item.quantity = 0 ]«destroy»[deleteItem]«destroy»Рис. 12.17. Диаграмма последовательностей прецедента ManageBasketProduct в ShoppingBasket. Однако можно поспорить о необходимости такого уровня детализации в анализе. Диаграмма последовательностей,явно не отображающая удаление Item, тоже была бы вполне допустимой.12.10.2.
Организация итераций операторами loop и breakloop позволяет моделировать итерацию.Очень часто на диаграммах последовательностей необходимо показатьциклы. Сделать это можно с помощью операторов loop и break, как показано на рис. 12.18.288Глава 12. Реализация прецедентовsd LoopAndBreakSyntaxповторять минимальноеколичество раз, затем,пока условие истинно,повторять (max – min)количество раз:A:Bloop min, max [условие]op1()повторять, покаусловие истинноloop [условие]op2()breakbreak долженбыть глобальнымпо отношению к loopop3()при выходеиз цикла сделать этоop4()этого не происходит,если выполняется breakРис.
12.18. Отображение циклов на диаграмме последовательностейс помощью операторов loop и breakОператор loop действует следующим образом:loop min количество раз thenwhile (условие истинно)loop (max min) количество разВ синтаксисе loop необходимо обратить внимание на следующие моменты:• оператор loop без max, min или condition является бесконечным циклом;• если задано только min, значит, max = min;• condition обычно является логическим выражением, но может бытьи произвольным текстом, смысл которого ясен.На первый взгляд loop может показаться слишком сложным, но он может использоваться для поддержки огромного числа разнообразныхциклов. Некоторые из самых распространенных циклов перечисленыв табл.
12.4.Когда сторожевое условие break становится истинным, выполняетсяоперанд break, цикл прерывается.Оператор break может использоваться для обозначения условия прекращения loop и того, что происходит после этого. У оператора break28912.10. Комбинированные фрагменты и операторытолько одно сторожевое условие, и если оно истинно, исполняется телоbreak, а loop прерывается. Самое главное, что после завершения breakloop не возобновляется.Таблица 12.4Тип циклаСемантикаВыражение циклаwhile( true ){ тело }Бесконечный цикл.loop или loop *for i = n to m{ тело }Повторяется ( m – n ) раз.loop n, mwhile( booleanExpression ){ тело }Повторяется, пока booleanEx loop [ booleanExprespression (логическое выраже sion ]ние) истинно.repeat{ тело }while( booleanExpression )Выполнить один раз, а затем loop 1, * [ booleanExповторять, пока booleanEx pression ]pression истинно.forEach object in collection{ тело }Выполнить тело цикла по од loop [ for each objectному разу для каждого объ in collectionOfObjects ]екта в коллекции объектов.forEach object of class{ тело }Выполнить тело цикла по од loop [ for each objectному разу для каждого объ in ClassName ]екта определенного класса.Комбинированный фрагмент break логически находится вне цикла: онне является его частью.
Поэтому фрагмент break всегда должен изображаться вне loop, но пересекаться с ним, как показано на рис. 12.18.Самым распространенным применением циклов является переборколлекции объектов. Например, цикл может применяться как возможная реализация операции findCourse(...) класса RegistrationManager(рис. 12.19).Эта операция возвращает объект Course с соответствующим именем(name) или null, как показано на рис.
12.20. Имя конца ассоциацииRegistrationManager10..*CoursecoursesfindCourse( name : String ) : CoursefindStudent( name : String ) : Student0..*registration0..*10..*StudentstudentsРис. 12.19. Применение цикла для реализации операции поиска FindCourse()290Глава 12. Реализация прецедентовsd FindCourse( name : String ) : Course:RegistrationManagerloop [for each course in courses]coursescourse:CoursecourseName = getName()break [name = courseName]coursenullРис. 12.20. Применение цикла для перебора коллекции объектовс кратностью больше 1 можно использовать как коллекцию объектов.В данном случае для представления коллекции объектов Course используется имя courses (курсы).12.11.
Коммуникационные диаграммыКоммуникационные диаграммы акцентируют внимание на структурных аспектах взаимодействия, на том, как соединяются линии жизни.В UML 2 их семантика довольно слаба по сравнению с диаграммамипоследовательностей.Коммуникационные диаграммы акцентируют внимание на структурныхаспектах взаимодействия.Мы уже приводили некоторые коммуникационные диаграммы. Согласно спецификации UML 2.0 [UML2S] диаграммы объектов, которые были представлены в главе 7, могут считаться особыми случаямидиаграмм классов или особыми случаями коммуникационных диаграмм формы экземпляров, где каждая линия жизни представляет экземпляр класса (объект).Синтаксис коммуникационных диаграмм подобен синтаксису диаграмм последовательностей, за исключением того, что здесь у линийжизни нет «хвостов».
Вместо этого они соединены связями, образующими коммуникационные каналы для передачи сообщений. Порядоксообщений определяется путем иерархической нумерации.На рис. 12.21 показана простая коммуникационная диаграмма дляпрецедента AddCourses, в котором :Registrar добавляет два новых объекта29112.11.
Коммуникационные диаграммыsd AddCoursesпорядковый номерлиния жизниcообщениеuml:Course1.1: «create»1: addCourse( "UML" )2: addCourse( "MDA" ):RegistrationManager:Registrarсвязь2.1: «create»mda:Courseсообщениесоздания объектаРис. 12.21. Коммуникационная диаграмма прецедента AddCoursesCourse. Следует обратить внимание на нумерацию сообщений, обозначающую их последовательность и вложенность в другие сообщения.Ниже пошаговая интерпретация рис. 12.21.1.
addCourse( "UML" ) – сообщение addCourse(...) отправляется линии жизни объекта :RegistrationManager с параметром "UML". Экземпляр :RegistrationManager инициирует операцию addCourse( … ) и передает в неепараметр "UML", фокус управления переходит в эту операцию.1.1. «create» – порядковый номер 1.1 говорит о том, что фокус управления попрежнему находится в операции addCourse(...). :RegistrationManager посылает анонимное сообщение, помеченное стереотипом «create». Такие сообщения «create» создают новые объекты, и это конкретное сообщение создает новый объект uml:Course.Позже при анализе или проектировании этому анонимному сообщению будет дано имя и, возможно, параметры, но пока достаточно показать, что создается новый объект uml:Course. После создания объекта из операции addCourse( … ) больше не посылается никаких сообщений, и этот поток возвращается.2.
addCourse( "MDA" ) – в :RegistrationManager посылается сообщение addCourse(…) с параметром "MDA". Фокус управления переходит к операции addCourse( … ).2.1. «create» – порядковый номер 2.1 говорит о том, что фокус управления попрежнему находится в операции addCourse(…). :RegistrationManager посылает анонимное сообщение, помеченное стереотипом «create»; это создает новый объект, mda:Course. Послесоздания объекта фокус управления addCourse(…) возвращаетсяи итерация завершается.Поначалу могут возникнуть некоторые сложности с прочтением коммуникационных диаграмм, потому что в них заключено довольно мно292Глава 12.