Дж. Арлоу, А. Нейштадт - UML 2 и Унифицированный процесс - Практический объектно-ориентированный анализ и проектирование (1158625), страница 103
Текст из файла (страница 103)
25.20 постусловие Subject::notify() состоит в том, что Observer::update() был вызван для каждого присоединенного Observer. Наязыке OCL это может быть выражено следующим образом:context Subject::notify( )25.13. Что мы узнали579post: каждый наблюдатель должен быть уведомлен через вызов update()self.observers.forAll( observer | observer^update() )В данном постусловии происходит перебор всех observers в Set и проверка получения ими сообщения update(). Оператор ^ – это оператор «hassent». Он возвращает true, если указанное сообщение было посланооперацией.
Он может использоваться только в постусловиях.Если сообщение синхронное (вы знаете, что оно вернется), можно проверять возвращаемое значение сообщения:context Subject::notify( )post: возвращаемое значение update( ) должно быть true для каждого наблюдателяself.observers.forAll( observer |observer^update().hasReturned() impliesobserver^update().result())25.13. Что мы узналиВ этом введении в OCL мы узнали следующее:• OCL – стандартное расширение UML. Он может:• определять запросы;• определять ограничения;• определять тело операции запроса;• определять бизнесправила во время разработки модели.• OCL не язык действий для UML. Он не может:• менять значения элемента модели;• определять тело операции (кроме операций запроса);• выполнять операции (кроме операций запроса);• динамически определять бизнесправила.• OCLвыражения.• Состоят из:• контекста пакета (необязательно) – определяет пространствоимен для OCLвыражения;• контекста выражения (обязательно) – определяет экземплярконтекста для выражения;• одного или более выражений.• Контекст выражения может быть определен явно или путем размещения OCLвыражения в примечании к элементу модели.580Глава 25.
Введение в OCL••Экземпляр контекста – образец экземпляра контекста выражения:• OCLвыражения записываются в рамках экземпляра контекста.Типы OCLвыражений.• inv: – инвариант:• применяется к классификаторам;• экземпляр контекста – экземпляр классификатора;• инвариант должен быть true для всех экземпляров классификатора.• pre: – предусловие операции:• применяется к операциям;• экземпляр контекста – экземпляр классификатора, которомупринадлежит операция;• предусловие должно выполняться для обеспечения возможности выполнения операции.• post: – постусловие операции:• применяется к операциям;• экземпляр контекста – экземпляр классификатора, которомупринадлежит операция;• постусловие должно быть истинным после выполнения операции;• ключевое слово result обозначает результат операции;• feature@pre возвращает значение свойства (feature) до выполнения операции:• @pre может использоваться только в постусловиях;• OclMessage может использоваться только в постусловиях.• body: – определяет тело операции:• применяется к операциям запроса;• экземпляр контекста – экземпляр классификатора, которомупринадлежит операция.• init: – задает начальное значение:• применяется к атрибутам или концам ассоциаций;• экземпляр контекста – атрибут или конец ассоциации.• def: – добавляет атрибуты и операции в классификатор с помощью стереотипа «OclHelper»:• применяется к классификатору;• экземпляр контекста – экземпляр классификатора;• добавляет атрибуты и операции в классификатор с помощьюстереотипа «OclHelper»:• может использоваться только в OCLвыражениях.25.13.
Что мы узнали••••581let – определяет локальную переменную:• применяется к OCLвыражению;• экземпляр контекста OCLвыражения.• derive: – определяет производное значение:• применяется к атрибутам или концам ассоциаций;• экземпляр контекста – экземпляр классификатора, которомупринадлежит операция.Комментарии:• /* многострочные */• однострочныеСтаршинство операций:• ::• @pre• .• >• not ^ ^^• */• +• if then else endif• > < <= >=• = <>• and or xor• impliesСистема типов OCL.• OclAny:• супертип всех типов OCL и типов UMLмодели.• OclType:• подкласс OclAny;• перечисление всех типов ассоциированной UMLмодели.• OclState:• подкласс OclAny;• перечисление всех состояний ассоциированной UMLмодели.• OclVoid:• тип «null» в OCL – имеет единственный экземпляр под названием OclUndefined.• OclMessage – используется для:• подтверждения отправки сообщения;582Глава 25.
Введение в OCL••••••• подтверждения возвращения сообщения;• получения возвращаемого значения сообщения;• возвращения коллекции сообщений, отправленных объекту.• Примитивные типы OCL:• Boolean;• Integer;• Real;• String.• Tuples – структурированный тип:• Tuple { имяЧасти1:типЧасти1 = значение1, имяЧасти2:типЧасти2 = значение2, ... }Инфиксные операторы – для их добавления в типы UML просто определяется операция с соответствующей сигнатурой, например=(параметр) : Boolean.Коллекции:• Set – { unordered, unique } (применяется по умолчанию)• OrderedSet – { ordered, unique }• Bag – { unordered, nonunique }• Sequence – { ordered, nonunique }Операции над коллекциями должны инициироваться с помощьюоператора –>.Итерационные операции:• коллекция–> <операцияИтератора>(<переменнаяИтератора>:<Тип> | <выражениеИтератора>);• <переменнаяИтератора> и <Тип> необязательны.Навигация в рамках экземпляра контекста:• self – организует доступ к экземпляру контекста;• оператор «точка» – организует доступ к возможностям экземпляра контекста.Навигация по ассоциациям:• self – организует доступ к экземпляру контекста;• имя роли – обозначает объект или набор объектов на конце ассоциации;• оператор «точка» – перегружен:• self.roleName:• кратность 1 – обеспечивается доступ к объекту на концеассоциации;• кратность >1 – обеспечивается доступ к коллекции на конце ассоциации;25.13.
Что мы узнали••••••••583self.roleName.feature:• кратность 1 – возвращает значение свойства (feature);• кратность > 1 – возвращает Bag значений свойств всех участвующих объектов (является сокращенной записью дляself.roleName>collect( feature )).Навигация по нескольким ассоциациям, где все кратности > 1:• self.roleName1.roleName2.feature – возвращает Bag значений этогосвойства (feature) всех участвующих объектов.OCL на диаграммах взаимодействий используется для определения:• сторожевого условия;• селектора линии жизни;• параметров сообщения.OCL на диаграммах деятельностей используется для определения:• узлов вызова действий;• сторожевых условий переходов;• объектных узлов;• операций;• состояния объекта.OCL на диаграммах состояний используется для определения:• сторожевых условий;• условий, накладываемых на состояния;• целей действий;• операций;• значений параметров.Навигация к и от классовассоциаций:• к классамассоциаций – используется имя классаассоциации;• от классовассоциаций – используются имена ролей.Навигация по квалифицированным ассоциациям:• после имени роли в квадратных скобках указывается разделенный запятыми список квалификаторов.Унаследованные ассоциации:• OCLвыражения используются для ограничения типов участников в унаследованных ассоциациях.AПример модели прецедентовA.1.
ВведениеНаш опыт свидетельствует о том, что UMLмодели не терпят бумаги.Если вам когдалибо приходилось распечатывать большую UMLмодель, включая спецификации, вам точно известно, что имеется в виду!UMLмодели лучше представлять в более гибком формате – в виде гипертекста. В настоящее время это или средство моделирования, иливебсайт.Включение полного учебного примера UML в эту книгу сделало бы еенамного толще и дороже. Мы также несли бы ответственность за намного большее количество уничтоженных деревьев.
Поэтому было решено предоставить пример для этой книги на нашем вебсайте(www.umlandtheunifiedprocess.com). Нам кажется, что ориентироваться в электронном варианте легче, чем в бумажном.Предлагаемый вашему вниманию пример охватывает ОО анализ и проектирование, необходимые для создания небольшого вебприложенияэлектронной коммерции. В этом приложении в упрощенном виде приводится несколько наиболее ярких моментов модели прецедентов, чтобы дать представление о том, что доступно на сайте!A.2. Модель прецедентовДанная модель прецедентов создана для простой системы электроннойкоммерции по продаже книг и CD.
Эта система называется ECP (ECommerce Platform – платформа электронной коммерции). На рис. А.1показан окончательный результат моделирования прецедентов.Модель прецедентов обеспечит четкое представление о том, что делаетсистема, но все подробности представлены на вебсайте.585Пример модели прецедентовЕСРLogOnUserUserCloseOrderCardProcessingCompanyAcceptPaymentByCardDispatcher«include»InventorySystemCheckoutDisplayBasketextension pointsmanageBasketextension point:manageBasket«include»«extend»AddltemToBasketCustomerManageBasketCancelOpenOrderBrowseProducts«include»ViewProductsFindProductsFindBooks«include»FindCDsViewBooksCreateNewCustomerDisplayOpenOrdersLogOnCustomerUpdateCustomerDeleteCustomerShopkeeperAddProductToCatalogDeleteProductFromCatalogCreateNewUserSystemAdministratorDeleteUserРис.