Дж. Арлоу, А. Нейштадт - UML 2 и Унифицированный процесс - Практический объектно-ориентированный анализ и проектирование, страница 101
Описание файла
PDF-файл из архива "Дж. Арлоу, А. Нейштадт - UML 2 и Унифицированный процесс - Практический объектно-ориентированный анализ и проектирование", который расположен в категории "". Всё это находится в предмете "объектно-ориентированный анализ и проектирование" из 7 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 101 страницы из PDF
Например, в OCLвыражениях может быть полезной операция для проверки возможности снятия денег со счета. Ее можно было бы определить следующимобразом:context CheckingAccountdef:canWithdraw( amount : Real ) : Boolean = ( (availableBalance amount ) >= 0 )25.10.6. Выражения letЕсли def: предоставляет возможность определять переменные уровняконтекста выражения, то let позволяет задавать переменные, областьдействия которых ограничена конкретным OCLвыражением. Эти пере566Глава 25. Введение в OCLменные подобны локальным переменным в обычных языках программирования.
И назначение их практически такое же – хранение вычисленного значения, используемого в выражении более одного раза.let определяет локальную переменную OCLвыражения.Выражение let состоит из двух частей – let и in.let <имяПеременной>:<типПеременной> = <выражениеLet> in<использующееВыражение>В первой части значение выражения let (<выражениеLet>) присваиваетсяпеременной (<имяПеременной>).
Вторая часть определяет OCLвыражение, являющееся областью действия переменной и местом, где она может использоваться (<использующееВыражение>).В нашем примере банковского счета на самом деле нет необходимостив выражении let. Однако для иллюстрации рассмотрим пример, в котором определена переменная originalBalance (исходный баланс), локальная для ограничения withdrawalSucceeded.context BankAccount::withdraw( amount : Real )post withdrawalSucceeded:let originalBalance : Real = self.balance@pre in окончательный баланс – это исходный баланс минус снятая суммаself.balance = originalBalance amount25.10.7. derive:OCL может использоваться для определения значений производныхатрибутов.Значения производных атрибутов определяются с помощью derive.Наш пример с банковским счетом можно реорганизовать и выразитьпеременную баланса и переменную превышения кредита с помощьюпроизводных атрибутов (рис.
25.14).Правила вывода этих производных атрибутов можно описать следующим образом:context CheckingAccount::availableBalance : Realderive: можно снимать сумму, не превышающую ограничения по превышению кредитаbalance + overDraftLimitcontext CheckingAccount::availableOverdraft : Realderive:if balance >= 0 then возможность превышения кредита доступна полностьюoverdraftLimit56725.11. OCL на диаграммах других типовownedAccountsBankAccountowner*1balance : RealaccountNumber : Stringdeposit( amount : Real ):Realwithdraw( amount : Real )getBalance() : RealgetOwner() : PersongetOperators() : Person[]*operator1..*getName() : StringgetId() : StringgetAddress() : StringDepositAccountCheckingAccountoverdraftLimit : Real/availableBalance : Real/availableOverdraft : RealoperatedAccountsPersonname : Stringid : Stringaddress : Stringпроизводныеатрибутыwithdraw( amount : Real )withdraw( amount : Real )getAvailableBalance() : RealgetAvailableOverdraft() : RealРис.
25.14. Производные атрибутыelse возможность превышения кредита использована частичноoverdraftLimit + balanceendifЭто упрощает определение операций CheckingAccount::getAvailableBalance() и CheckingAccount::getAvailableOverdraft():context CheckingAccount::getAvailableBalance() : Realbody:availableBalancecontext CheckingAccount::getAvailableOverdraft() : Realbody:availableOverdraft25.11. OCL на диаграммах других типовДо сих пор мы рассматривали применение OCL только на диаграммахклассов.
Однако OCL может также использоваться на диаграммах других типов:• на диаграммах взаимодействий (глава 12);• на диаграммах деятельности (главы 14 и 15);• на диаграммах состояний (конечные автоматы) (главы 21 и 22).В следующих разделах рассмотрим применение OCL на диаграммахэтих типов.568Глава 25. Введение в OCL25.11.1. OCL на диаграммах взаимодействийНа диаграммах взаимодействий OCL используется для представленияограничений.
Необходимо помнить, что с помощью OCL нельзя описать поведение, поскольку данный язык не имеет побочных эффектов.На диаграммах взаимодействий OCL может использоваться везде, гденеобходимо сделать следующее:•определить сторожевое условие;•определить селектор линии жизни (раздел 12.6);•определить параметры сообщения.Рассмотрим пример использования OCL на диаграммах последовательностей.
На рис. 25.15 изображена диаграмма классов простой системы электронной почты.Класс EmailAddress (электронный адрес) представляет адрес электронной почты. Например, адрес электронной почты jim@umlandtheuni+fiedprocess.com был бы представлен как объект класса EmailAddress, какпоказано на рис. 25.16. В данном случае операция EmailAddress:get1MailSystemclassifyMessage( m : Message )…11reviewBox10..*0..*inBoxMailSystemsubject : Stringcontent : StringmessageType1setType( type : MessageType )…11replyTo 0..1cc0..*bcc0..*11fromAddress 11..*toAddressesEmailAddresswhiteList0..*1address : StringgetName() : Stringblacklist getDomain() : StringgetAddress() : String0..* …Рис.
25.15. Диаграмма классов системы электронной почты<<enumeration>>MessageType1 LegitimateUnclassified25.11. OCL на диаграммах других типов569jimsAddress:EmailAddressaddress = "jim@umlandtheunifiedprocess.com"Рис. 25.16. Адрес электронной почты jim@umlandtheunifiedprocess.comпредставлен как объект класса EmailAddressName() возвращает "Jim", EmailAddress::getDomain() возвращает "umlandtheunifiedprocess.com" и EmailAddress::getAddress() возвращает "jim@umlandtheunifiedprocess.com". Объекты EmailAddress эквивалентны, если их атрибуты address (адрес) имеют одинаковое значение.Система для обработки пришедшей почты пользуется политикой белый/черный список:• Все почтовые сообщения, адрес отправителя (fromAddress) которыхвходит в черный список (blackList), удаляются.• Все почтовые сообщения, fromAddress которых входит в белый список (whiteList), помещаются в ящик входящей почты (inBox).• Все остальные почтовые сообщения помещаются в ящик для просмотра (reviewBox).• Состояние пришедшего сообщения (Message) меняется соответственно его типу: спам (удаляется), Legitimate (допустимый) или Unclassified (неклассифицированный).На рис.
25.17 показана диаграмма последовательностей для операцииMailSystem::classifyMessage( m : Message ). Диаграмма деятельностей дляэтой операции представлена в следующем разделе на рис. 25.18, и выдолжны заметить, как эти диаграммы соответствуют друг другу. Диаграмма последовательностей определяет, какие классы и операцииреализуют поведение, описанное диаграммой деятельностей.MailSystem (система электронной почты) – контекст выражения. OCLиспользовался для определения условий в комбинированном фрагменте alt.С помощью OCL также было задано состояние объектов на диаграмме(хотя это обычное применение OCL, поскольку OCL и UML имеют одинаковый синтаксис для описания состояний).25.11.2. OCL на диаграммах деятельностиДиаграммы деятельности можно создавать для описания поведениялюбого элемента UMLмоделирования.
На диаграммах деятельностейOCL используется для определения:• узлов вызова действия;• сторожевых условий переходов;• объектных узлов;• состояния объекта.570Глава 25. Введение в OCLsd ClassifyMessage:MailSystemm:Message:inBox:reviewBoxclassifyMessage( m : Message )setT ype( Unclassified )Unclassifiedalt[ blackList !>exists( a | a.getAddress() = m.fromAddress.getAddress() ) ]«delete»[ whiteList!>exists( a | a.getAddress() = m.fromAddressgetAddress() ) ]setT ype( Legitimate )Legitimateadd( m )[else]add( m )Рис.
25.17. Диаграмма последовательностей для операцииMailSystem::classifyMessage( m : Message )Например, на рис. 25.18 показана очень простая диаграмма деятельности для описания поведения ClassifyMailMessage (классифицироватьпочтовое сообщение) системы электронной почты, рассматриваемогов предыдущем разделе.Как видите, OCL используется для описания объектов, их состоянийи условий.OCL применяется для точного моделирования, а диаграммы деятельности по своей природе не могут быть точными.
Кроме того, они частопредназначаются для заказчиков, которые не являются специалистами в технической области. Поэтому целесообразность применения OCLна диаграммах этого типа довольно сомнительна. Например, ограничения на рис. 25.18 могли бы быть записаны просто на естественномязыке (английском или русском).
Рассматривая возможность использования OCL на диаграммах деятельности, всегда необходимо учитывать назначение диаграммы и ее целевую аудиторию.25.11.3. OCL на диаграммах состоянийOCL используется в диаграммах состояний для определения:•сторожевых условий;57125.11. OCL на диаграммах других типовClassifyMailMessageGetMailMessagemessage[Unclassified][ blackList !>exists( a | a.getAddress() = m.fromAddress.getAddress() ) ]DeleteMessageelse[ whiteList !>exists( a | a.getAddress() = m.fromAddress.getAddress() ) ]ClassifyMessageAsLegitimateelsemessage[Unclassified]message[Legitimate]FileMessageForReviewFileMessageInInBoxРис. 25.18.
Диаграмма деятельностей••••условий, налагаемых на состояния;целей действий;операций;значений параметров.Экземпляр контекста – это экземпляр классификатора, которому принадлежит конечный автомат. В качестве примера рассмотрим конечный автомат CheckingAccountActive (активный текущий счет) класса CheckingAccount (рис. 25.19).Из рисунка видно, что на диаграмме синтаксис OCL используется в сторожевых условиях. Чтобы конечный автомат был рабочим, необходимо учесть ограничения, которые записаны отдельно, чтобы не загромождать диаграмму.context CheckingAccount::balanceint:0context CheckingAccountinv:oclInState( InCredit ) implies ( balance >= 0 )572Глава 25. Введение в OCLCheckingAccountActiveActiveAcceptingWithdrawal[enoughMoney]withdraw( amount )OperatingHdeposit( amount )InCreditcloseopen[not inCredit]closed[inCredit]Overdrawn[notenoughMoney]withdraw( amount )RejectingWithdrawalРис.
25.19. Конечный автомат CheckingAccountActiveinv:oclInState( Overdrawn ) implies ( balance <0 )def:availableBalance = ( balance + overdraftLimit )def:enoughMoney = ( ( availableBalance – amount ) >= 0 )def:inCredit = ( balance >= 0 )Обратите внимание, как с помощью oclInState( InCredit ) организованассылка на состояние InCredit. В качестве альтернативы можно было быприкрепить инвариант (balance >= 0) прямо к состоянию InCredit в видепримечания.57325.12. Дополнительные вопросы25.12. Дополнительные вопросыВ данном разделе рассматриваются некоторые не часто используемыеаспекты OCL:• навигация к и из классовассоциаций;• навигация по квалифицированным ассоциациям;• унаследованные ассоциации;• OCLMessage.25.12.1. Навигация к и от классовассоциацийИмя классаассоциации используется для навигации к классуассоциации.Классыассоциации обсуждаются в разделе 9.4.5.