UML2 и унифицированный процесс. Джим арлоуайла нейштадтпрактический объектно ориентированныйанализ и проектированиеu
![]()
|
25.11.1. OCL на диаграммах взаимодействий 25.2. Что такое объектный язык ограничений (OCL)? 25.3. Почему OCL? 25.4. Синтаксис выражений OCL 25.8.2. Система типов OCL 25.8.3. Простые типы 25.8.4. Тип Tuple 25.8.5. Инфиксные операторы 25.8.6. OCL коллекции 25.9. Навигация в OCL 25.9.1. Навигация в рамках экземпляра контекста 25.13. Что мы узнали 25.12.4. OclMessage 25.12.3. Унаследованные ассоциации 25.12.2. Навигация по квалифици рованным ассоциациям 25.12.1. Навигация к и из классов ассоциаций 25.12. Дополнительные вопросы 25.11.3. OCL на диаграммах состояний 25.11.2. OCL на диаграммах деятельности 25.9.2. Навигация по ассоциациям 25.9.3. Навигация по нескольким ассоциациям 25.10. Типы OCL выражений подробно 25.10.1. inv: 25.10.2. pre:, post: и @pre 25.10.3. body: 25.10.4. init: 25.10.5. def: 25.10.6. Выра жения let 25.10.7. derive: 25.11. OCL на диаграммах других типов 25.3. Почему OCL? 529 • писать запросы для организации доступа к элементам модели и их значениям; это язык запросов, немного похожий на SQL; • накладывать ограничения на элементы модели – можно определять бизнес правила как ограничения, накладываемые на элементы мо дели; • определять операции запросов. OCL не язык действий для UML, потому что выражения OCL не оказывают побочных эффектов. Очень важно понять, что OCL не является языком действий для UML. С его помощью невозможно определить поведение, потому что OCL выражения не имеют побочных эффектов. Таким образом: • OCL не может менять значение элемента модели – можно только за прашивать значения и накладывать условия на значения; • OCL не может определять операции, за исключением операций за просов; • OCL может выполнять только операции запроса, не изменяющие значений; • OCL не может применяться для динамического определения биз нес правил во время выполнения – с его помощью можно описы вать бизнес правила только во время моделирования. Выражения OCL могут храниться в файлах, ассоциированных с UML моделью. Как это делается, зависит от конкретного используемого средства моделирования. Однако спецификация OCL определяет осно ванный на XML формат обмена, поэтому OCL выражения можно ис пользовать с разными инструментальными средствами. OCL выражения также могут быть прикреплены непосредственно к элементам UML модели в виде примечаний. Преимущество такого подхода состоит в визуализации OCL выражений в модели. Но есть и недостаток – возможность загромождения модели, если выражений очень много. 25.3. Почему OCL? Есть несколько причин, по которым OCL может оказаться полезным. • OCL позволяет средствам моделирования при наличии соответст вующей поддержки анализировать UML модели – например, сюда может входить проверка согласованности. • OCL позволяет средствам моделирования, имеющим поддержку OCL, генерировать код на основании OCL выражений – например, с по мощью инструментального средства можно было бы генерировать код реализации OCL ограничений, таких как предусловия и пост условия операции. 530 Глава 25. Введение в OCL • OCL обеспечивает возможность создавать более точные модели – это уменьшает вероятность неверного толкования модели. • OCL является частью сертификационного экзамена OCUP (OMG Certified UML Professional – сертифицированный OMG специалист UML) – в тест включено очень мало вопросов по OCL, но они там есть. Есть несколько причин, по которым OCL может показаться бесполез ным • OCL довольно сложен для восприятия – он имеет нестандартный синтаксис и множество необычных «сокращенных» форм. • В настоящее время с OCL знакомы очень немногие разработчики моделей и еще меньшее число программистов – таким образом, мо жет оказаться, что OCL выражения не «найдут своего зрителя». • Такой уровень точности, который предлагает OCL, может оказаться ненужным – например, если создается неформальная UML модель, которая будет передана для уточнения программистам, OCL может быть излишним. Мы считаем, что OCL – это просто еще один инструмент в инструмен тарии средств моделирования, который может использоваться при создании строгих UML моделей. Его полезно знать, чтобы уметь при менять там, где он действительно нужен. 25.4. Синтаксис выражений OCL OCL – небольшой язык, но он обладает на удивление сложным синтак сисом, который до сих пор развивается. В частности, он имеет синтак сические исключения и сокращения, которые иногда могут сбить с толку несведущего пользователя. Синтаксис имеет много общего со стилем С/С++/Java с некоторыми элементами Smalltalk. Семантика языка OCL (формально определенная) не зависит от како го либо конкретного синтаксиса. Со временем это может привести к возникновению альтернативных синтаксисов OCL. Уже существует SQL подобный синтаксис OCL для бизнес моделирования, описание которого можно найти в книге [Warmer 1]. В этой главе мы потратили много сил, пытаясь выделить наиболее не понятные аспекты синтаксиса (и семантики) OCL и сделать их макси мально прозрачными! В отличие от большинства основных языков программирования, OCL является декларативным языком. Это означает, что описывается ре зультат, который необходимо получить, а не способ достижения этого результата. Такие языки программирования, как Java, C#, C++ и большинство других, являются процедурными – в них шаг за шагом описывается, как получается желаемый результат. 25.4. Синтаксис выражений OCL 531 В традиционных языках программирования создаются программы, исполняющиеся для предоставления пользователю некоторого резуль тата. OCL выражения прикрепляются к элементам UML модели. В OCL создаются выражения, которые прикрепляются к элементам UML модели и определяют или ограничивают ее некоторым образом. Это фундаментальный момент и, вероятно, самый большой камень пре ткновения, с которым сталкиваются разработчики моделей и програм мисты при первой встрече с OCL. OCL не язык программирования, это язык ограничений. Самое главное, что необходимо помнить об OCL, – здесь определяются запросы и условия, а не поведение. Общая форма OCL выражения представлена на рис. 25.2. На рисунке полужирным шрифтом выделено ключевое слово OCL, а се рым – необязательные элементы. Угловые скобки ( <...>) указывают мес та, которые должны быть заменены соответствующими значениями. У каждого OCL выражения есть значение. OCL – типизированный язык. Каждое OCL выражение приводится к объекту некоторого типа. Как видно из рис. 25.2, OCL выражения можно разбить три части: • контекст пакета (необязательный); • контекст выражения (обязательный); • одно или более выражений. В следующих разделах мы подробно рассмотрим каждую из этих час тей. Для этого воспользуемся моделью представленной на рис. 25.3. Она предоставляет контекст для наших примеров OCL выражений. контекст пакета контекст выражения package <путьПакета> context <имяЭкземпляраКонтекста>: <элементМодели> <типВыражения> <имяВыражения> : <телоВыражения> <типВыражения> <имяВыражения> : <телоВыражения> endpackage выражение выражение Рис. 25.2. Общая форма OCL выражения 532 Глава 25. Введение в OCL 25.5. Контекст пакета и составные имена Контекст пакета определяет пространство имен OCL выражения. Необязательный контекст пакета позволяет задавать пакет, опреде ляющий пространство имен OCL выражения. Контекст пакета подчи няется следующим правилам: • Если контекст пакета не задан, пространством имен выражения по умолчанию становится вся модель. • Если OCL выражение прикрепляется непосредственно к элементу модели, по умолчанию пространством имен этого выражения ста новится пакет, которому принадлежит этот элемент. Например, на рис. 25.3 контекст пакета можно было бы определить как: package BankAccountExample::SimpleAccounts endpackage Если все элементы UML модели имеют уникальные имена, нет необхо димости в использовании контекста пакета, поскольку на каждый эле getAvailableBalance() : Real getAvailableOverdraft() : Real withdraw( amount : Real) BankAccountExample SimpleAccounts BankAccount deposit( amount : Real) getBalance() : Real getOwner() : String balance : Real owner : String accountNumber : String CheckingAccount DepositAccount withdraw( amount : Real) overdraftLimit : Real withdraw( amount : Real) Рис. 25.3. Модель с OCL выражениями 25.6. Контекст выражения 533 мент можно однозначно сослаться по имени. Однако если в разных па кетах есть элементы с одинаковыми именами, можно: • для каждого OCL выражения, ссылающегося на любой из элемен тов, определить контекст пакета ИЛИ (OR) • ссылаться на элементы с помощью полных составных имен, напри мер: BankAccountExample::SimpleAccounts::BankAccount. OCL синтаксис имени пути: Пакет1::Пакет2:: ... ::ПакетN::ИмяЭлемента 25.6. Контекст выражения Контекст выражения обозначает элемент UML модели, к которому при креплено OCL выражение. Контекст выражения обозначает элемент UML модели, к которому прикреплено OCL выражение. Например, если требуется прикрепить OCL выражение к классу Check ingAccount на рис. 25.3, контекст выражения можно было бы опреде лить следующим образом: package BankAccountExample::SimpleAccounts context account:CheckingAccount endpackage OCL выражения должны записываться в рамках экземпляра контекста. Контекст выражения определяет экземпляр контекста (contextual in stance ), имеющий необязательное имя ( account) и обязательный тип ( CheckingAccount). Экземпляр контекста необходимо рассматривать как образец экземп ляра класса, который может использоваться в OCL выражениях. Если экземпляру контекста присвоено имя, его можно использовать в теле выражения для ссылки на экземпляр контекста. Если имя эк земпляра контекста не задано, сослаться на него можно с помощью ключевого слова OCL self. Обычно мы используем это ключевое слово. В приведенном выше выражении экземпляр контекста – это экземп ляр класса CheckingAccount. Ссылаться на него можно как по имени (ac count), так и с помощью ключевого слова self. Тип экземпляра контекста зависит от контекста выражения. 534 Глава 25. Введение в OCL • Если контекст выражения – классификатор, экземпляр контекста всегда является экземпляром этого классификатора. • Если контекст выражения – операция или атрибут, экземпляр кон текста обычно является экземпляром классификатора, которому принадлежат эти операция или атрибут. Когда OCL выражение прикрепляется к элементу модели как приме чание (рис. 25.4), контекст выражения определяется точкой присое динения примечания, поэтому нет необходимости задавать его явно. 25.7. Типы OCL выражений Существует две категории OCL выражений – ограничивающие и опреде ляющие. Существует восемь разных типов OCL выражений, все они представле ны в табл. 25.1. Можно заметить, что эти выражения подразделяются на две категории: те, которые задают ограничения ( inv:, pre: и post:), и те, которые определяют атрибуты, тела операций и локальные пере менные ( init:, body:, def:, let и derive:). Таблица 25.1 Тип вы ражения Син таксис Применя ется к Экземпляр контекста Семантика Раздел Операции, которые ограничивают Инвари ант inv: Класси фикатор Экземпляр клас сификатора Инвариант должен быть истинным для всех экземпляров классификатора. 25.10.1 BankAccount balance : Real owner : String CheckingAccount overdraftLimit : Real DepositAccount суммы, снимаемые с текущих счетов, не должны превышать ограничения по превышению кредита inv: balance >= overdraftLimit Рис. 25.4. OCL выражение прикреплено к элементу модели как примечание 25.7. Типы OCL выражений 535 Ограничивающим операциям ( inv:, pre: и post:) можно присвоить имя выражения ( expressionName). Это позволяет ссылаться на них по имени, например, чтобы связать их с описаниями прецедентов или другими документами требований. Хорошим OCL стилем считается: • всегда давать имя ограничениям (даже несмотря на то, что имя яв ляется необязательным); Пред условие pre: Операция Элемент поведения Экземпляр клас сификатора, ко торому принадле жит операция Предусловие долж но быть истинным, чтобы операция могла выполняться. 25.10.2 Пост условие post: Операция Элемент поведения Экземпляр клас сификатора, ко торому принадле жит операция Постусловие долж но быть истинным после выполнения операции. Ключевое слово re sult ссылается на ре зультат операции. 25.10.2 Операции, которые определяют Тело опе рации за проса body: Операция запроса Экземпляр клас сификатора, ко торому принадле жит операция Определяет тело операции запроса. 25.10.3 Началь ное зна чение init: Атрибут Конец ас социации Атрибут Конец ассоциа ции Определяет началь ное значение атри бута или конец ас социации. 25.10.4 Опреде ление def: Класси фикатор Экземпляр клас сификатора, ко торому принадле жит операция Добавляет перемен ные или вспомога тельные операции в контекстный клас сификатор. Используется в OCL выражениях контекстного клас сификатора. 25.10.5 Присва ивание let OCL вы ражение Экземпляр кон текста OCL выра жения Добавляет локаль ные переменные в OCL выражения. 25.10.6 Произ водное значение derive: Атрибут Конец ас социации Атрибут Конец ассоциа ции Определяет прави ло вывода для про изводных атрибу тов или конца ассо циации. 25.10.7 Тип вы ражения Син таксис Применя ется к Экземпляр контекста Семантика Раздел 536 Глава 25. Введение в OCL • выбирать описательные имена, отражающие семантику ограниче ния; • гарантировать уникальность имен ограничений в рамках модели; • имена ограничений записывать в стиле lowerCamelCase. Определяющим операциям ( init:, body:, def:, let, derive:) имя выражения присвоить нельзя. Семантика различных типов OCL выражений подробно рассматрива ется в разделе 25.10 сразу после обсуждения тела и синтаксиса OCL выражений. 25.8. Тело выражения Тело выражения содержит суть OCL выражения. Простой пример пред ставлен на рис. 25.4. В следующих разделах мы представляем синтаксис OCL, чтобы дать вам возможность самим научиться создавать тело OCL выражений. 25.8.1. Комментарии, ключевые слова и правила старшинства операций Процессоры OCL игнорируют комментарии. Комментарии необходи мо активно использовать, чтобы сделать OCL выражения более понят ными. Комментарии необходимо активно использовать, чтобы сделать OCL вы ражения более понятными. Вы получите хороший комментарий OCL выражения, если просто пе репишете это выражение на английском (или немецком, или любом родном вам языке). В этой главе будут приведены примеры того, как это делается. В OCL используется два стиля комментирования: –– Это однострочный комментарий. Игнорируется вся строка после знака . /* Это многострочный комментарий. Игнорируется все, что заключено в символы комментария. */ Мы предпочитаем использовать однострочные комментарии. В OCL есть очень небольшой набор ключевых слов, которые не могут использоваться как имена в OCL выражениях: and, attr, context, def, else, endif, endpackage, if, implies, in, inv, let, not, oper, or, package, post, pre, then, xor, body, init, derive. Все они рассматриваются в этой главе. Операции OCL подчиняются правилам старшинства, как показано на рис. 25.5. 25.8. Тело выражения 537 В любом OCL выражении более высокие по старшинству операции вы полняются первыми. Таким образом, например, выражение 1 + 2 * 3 в результате дает 7, потому что операция умножения * имеет более вы сокий приоритет, чем операция сложения +. Приоритет операций можно изменить с помощью скобок, тогда (1 + 2) * 3 в результате дает 9. В любом языке программирования всегда лучше использовать скобки, а не полагаться на правила старшинства операций! 25.8.2. Система типов OCL OCL – строго типизированный язык. Для написания OCL выражений необходимо понимать систему типов OCL. Простые типы OCL – это Boolean, Integer, String и Real. Все языки программирования имеют набор простых типов, и OCL не исключение. Простые типы – это Boolean, Integer, Real и String. Они обсуждаются в разделе 25.8.3. В OCL также есть структурированный тип, Tuple (кор теж), который рассматривается в разделе 25.8.4. Кроме простых типов и Tuple OCL имеет ряд встроенных типов, кото рые перечислены ниже. • OclAny – супертип всех типов OCL и ассоциированной UML модели; • OclType – подкласс OclAny – перечисление всех типов ассоциирован ной UML модели; • OclState – подкласс OclAny – перечисление всех состояний ассоцииро ванной UML модели; :: @pre . –> not – ^ ^^ * / + if ... then ... else ... endif > < <= >= = <> and or xor implies старшинство в порядке убывания Рис. 25.5. Приоритет операций |