PrIS
.pdf
481
напрямленою від символа дочірної кооперації до символа коопераціїпредка (рис. 23.2). При цьому ролі дочірніх кооперацій можуть бути спеціалізаціями ролей кооперацій-предків.
Рис. 23.2. Графічне зображення відношення узагальнення між окремими коопераціями рівня специфікації .
В окремих випадках виникає необхідність явно вказати на той факт, що кооперація є реалізацією деякої операції або класифікатора. Це можна подати одним із двох способів.
По-перше, можна з'єднати символ кооперації пунктирною лінією зі стрілкою узагальнення із символом класу, реалізацію операції якого специфікує така кооперація (рис. 23.3, а). Так, якщо як клас розглянути "Замовлення на купівлю товару", у якого є операція "оформити_замовлення ()", то її реалізація може бути специфікована у формі кооперації.
Рис. 23.3. Способи подання кооперації, яка реалізує операцію класу.
По-друге, можна просто зобразити символ кооперації, всередині якого вказати всю необхідну інформацію, записану за певними правилами (рис. 23.3, б). Ці правила визначають формат запису імені кооперації,
482
після якого записують двокрапку і ім'я класу. Після імені класу слідує подвійна двокрапка й ім'я операції.
Подібне загальне подання кооперації на рівні специфікації використовується на початкових етапах проектування. У подальшому кожна з кооперацій підлягає деталізації на рівні прикладів, на яких розкривається зміст і структура взаємозв'язків її елементів на окремій діаграмі кооперації. При цьому як елементи діаграми кооперації виступають об'єкти і зв'язки, доповнені повідомленнями. Саме ці елементи є предметом подальшого розгляду цього розділу.
23.2. Об'єкти на діаграмі кооперації
Окремі аспекти специфікації об'єктів як елементів діаграм вже розглядалися раніше при описі діаграм класів (див. розділ 19) і послідовності (див. розділ 22). Зараз ми детальніше зупинимося на особливостях їх семантики і графічної нотації, оскільки об'єкти є основними елементами або графічними примітивами, з яких будується діаграма кооперації на рівні прикладів. Для графічного зображення об'єктів використовується такий самий символ прямокутника, як і для класів.
Як наголошувалося раніше, об'єкт (object) є окремим екземпляром класу, який створюється на етапі виконання програми. Він може мати своє власне ім'я і конкретні значення атрибутів. Стосовно об'єктів формат рядка класифікатора доповнюється іменем об'єкту і набуває такого вигляду (при цьому весь запис підкреслюється):
<Ім'я об'єкту>'/' <Ім'я ролі класифікатора> ':' <Ім'я класифікатора> [':' <Ім'я класифікатора >]*
Тут Ім'я ролі класифікатора може не вказуватися. У цьому випадку воно виключається з рядка тексту разом з подальшою двокрапкою. Ім'я ролі може бути опущене в тому випадку, якщо існує тільки одна роль в кооперації, яку можуть відігравати об'єкти, створені на базі цього класу.
Отже, для позначення ролі класифікатора досить вказати або ім'я класу (разом з двокрапкою), або ім'я ролі (разом з похилою межею). Інакше прямокутник відповідатиме звичайному класу. Якщо роль, яку повинен відігравати об'єкт, успадковується від декількох класів, то всі вони маютьі бути вказані явно і розділятися комою і двокрапкою.
Примітка
У прямокутнику об'єкту ім'я об'єкту, ім'я ролі із символом Т або ім'я класу можуть бути відсутніми. Проте двокрапка завжди повинна стояти перед іменем класу, а похила риска – перед іменем ролі. Ще раз акцентуємо увагу на тій обставині, що стосовно об'єктів весь запис має бути підкреслений, а ім'я об'єкту має записуватися з малої літери.
483
Нижче наводяться можливі варіанти запису рядка тексту у прямокутнику об'єкту.
: С – анонімний об'єкт, що створюється на основі класу С.
/ R – анонімний об'єкт, що відіграє роль R.
/ R : С – анонімний об'єкт, що створюється на основі класу С і що відіграє роль R.
О / R – об'єкт з іменем О, що відіграє роль R.
О : С – об'єкт з іменем О, що створений на основі класу С.
О / R : С – об'єкт з іменем О, що створений на основі класу С і відіграє роль R.
О або – об'єкт з іменем О.
О : – "об'єкт-сирота" з іменем О.
/ R – роль з іменем R.
: С – анонімна роль на базі класу С.
/ R : С – роль з іменем R на основі класу С.
Окремі приклади зображення об'єктів і класів на діаграмі кооперації наводяться на рис. 23.4.
Рис. 23.4. Приклади різних варіантів запису імен об'єктів, ролей і класів на діаграмах кооперації .
Так, у першому випадку (рис. 23.4, а) позначений об'єкт з іменем "клієнт", що відіграє роль "ініціатор запиту". Далі (рис. 23.4, б) наведене позначення анонімного об'єкту, який відіграє роль ініціатора запиту. В обох випадках не вказаний клас, на основі якого будуть створені ці об'єкти. Позначення класу присутнє в наступному варіанті запису (рис. 23.4, в), причому об'єкт також анонімний.
484
Стосовно рівня специфікації на діаграмах кооперації можуть бути присутніми іменовані класи із вказанням ролі класу в кооперації (рис. 23.4, г) або анонімні класи, коли вказується тільки його роль (рис. 23.4, д). Останній випадок характерний для ситуації, коли в моделі можуть бути присутніми декілька класів з іменем "Клієнт", тому треба явно вказати ім'я відповідного пакету База даних (рис. 23.4, е).
23.2.1. Мультиоб'єкт
Мультиоб'єкт (multiobject) це ціла множина об'єктів на одному з кінців асоціації. На діаграмі кооперації Мультиоб'єкт використовується для того, щоб показати операції і сиґнали, які адресовані всій множині об'єктів, а не тільки одному. Мультиоб'єкт зображається двома прямокутниками, один з яких виступає із-за верхньої правої вершини іншого (рис. 23.5, а). При цьому стрілка повідомлення відноситься до всієї множини об'єктів, які позначають такий мультиоб'єкт. На діаграмі кооперації може бути явно вказане відношення композиції між мультиоб'єктом і окремим об'єктом з його множини (рис. 23.5, б).
Рис. 23.5. Графічне зображення мультиоб'єктів на діаграмі кооперації .
23.2.2. Активний об'єкт
Уконтексті мови UML всі об'єкти діляться на дві категорії: пасивні
іактивні. Пасивний об'єкт оперує тільки даними і не може ініціювати діяльність із керування іншими об'єктами. Проте пасивні об'єкти можуть посилати сиґнали у процесі виконання запитів, які вони отримують.
Активний об'єкт (active object) має свою власну „нитку” (thread) керування і може ініціювати діяльність із керування іншими об'єктами. При цьому під „ниткою” розуміється деякий полегшений потік керування, який може виконуватися паралельно з іншими обчислювальними „нитками” або „нитками” керування в межах одного обчислювального процесу або процесу керування.
Примітка
485
Відмінність між процесом і „ниткою” полягає у ступені використання ресурсів. Кажучи про процес, мають на увазі ресурсоємний потік керування, тобто процес повністю монополізує ресурси системи. „Нитка” може використовувати лише невелику частину ресурсів системи. Прикладом може служити виконання деякої програми в її адресному просторі або у фоновому режимі.
Активні об'єкти на канонічних діаграмах позначаються прямокутником з ширшими межами (рис. 23.6). Іноді може бути явно вказане ключове слово (позначене значення) {active}, щоб виділити активний об'єкт на діаграмі. Кожний активний об'єкт може ініціювати єдину „нитку” або процес керування і зображати початкову точку потоку керування. У наведеному фраґменті діаграми кооперації активний об'єкт "а: Абонент, який викликає" є ініціатором процесу встановлення з'єднання для обміну інформацією з іншим абонентом (на діаграмі не показаний).
Рис. 23.6. Графічне зображення активного об'єкту (зліва) на діаграмі кооперації .
У наступному прикладі розглядається ситуація з викликанням функції друку із текстового редактора (рис. 23.7). Анонімний активний об'єкт "Текстовий редактор" спочатку посилає повідомлення анонімному мультиоб'єкту "Принтер", який ініціює вибір єдиного об'єкту "Принтер", що, можливо, задовольняє деякі додаткові умови. Після цього вибраному об'єкту посилається повідомлення про необхідність надрукувати документ, завантажений у текстовий редактор.
486
Рис. 23.7. Фраґмент діаграми кооперації для викликання функції друку із текстового редактора.
23.2.3. Складений об'єкт
Складений об'єкт (composite object) або об'єкт-контейнер призначений для подання об'єкту, що має власну структуру і внутрішні потоки (нитки) керування. Складений об'єкт є екземпляром складеного класу (класу-контейнера), який зв'язаний відношенням аґреґації або композиції (див. розділ 19) зі своїми частинами. Аналогічні відношення зв'язують між собою і відповідні об'єкти.
На діаграмах кооперації такий складений об'єкт зображається як звичайний об'єкт, що складається із двох секцій: верхньої і нижньої. У верхній секції записується ім'я складеного об'єкту, а в нижній – його складові частини замість списку його атрибутів (рис. 23.8). При цьому допускається мати як частини інші складені об'єкти.
487
Рис. 23.8. Графічне зображення складеного об'єкту на діаграмі кооперації.
23.3. Зв'язки
Зв'язок (link) є екземпляром або прикладом довільної асоціації. Зв'язок як елемент мови UML може мати місце між двома і більше об'єктами. Бінарний зв'язок на діаграмі кооперації зображається відрізком прямої лінії, що з’єднує два прямокутники об'єктів (див. рис. 23.7). На кожному з кінців цієї лінії можуть бути явно вказані імена ролей цієї асоціації. Поряд з лінією в її середній частині може записуватися ім'я відповідної асоціації.
Зв'язки не мають власних імен, оскільки повністю ідентичні як екземпляри асоціації. Іншими словами, всі зв'язки на діаграмі кооперації можуть бути тільки анонімними і записуються без двокрапки перед іменем асоціації. Для зв'язків не вказується також і кратність. Проте інші позначення спеціальних випадків асоціації (аґреґація, композиція) можуть бути присутніми на окремих кінцях зв'язків. Наприклад, символ зв'язку типу "композиція" між мультиоб'єктом "Принтер" і окремим об'єктом "Принтер" (див. рис. 23.7).
23.3.1. Стереотипи зв'язків
Зв'язок може мати деякі стереотипи, які записуються поряд з одним з його кінців і вказують на особливість реалізації цього зв'язку. У мові UML з цією метою можуть використовуватися такі стереотипи:
488
"association" – асоціація (передбачається за замовчуванням, тому цей стереотип можна не вказувати);
"parameter" – параметр методу; відповідний об'єкт може бути тільки параметром деякого методу;
"local" – локальна змінна методу; її область видимості обмежена тільки сусіднім об'єктом;
"global" – глобальна змінна; її область видимості розповсюджується на всю діаграму кооперації;
"self" – рефлексивний зв'язок об'єкту із самим собою, який допускає передавання об'єктом повідомлення самому собі; на діаграмі кооперації зв'язок рефлексії зображається петлею у верхній частині прямокутника об'єкту.
Деякі приклади зв'язків з різними стереотипами зображені на рис. 23.9. Тут наведенаузагальнена схема деякої конкретної компанії з іменем "с", яка складається з відділів (анонімний мультиоб'єкт "Відділ"). Останні, своєю чергою, складаються зі співробітників (анонімний мультиоб'єкт "Співробітник"). Зв'язок рефлексії вказує на той факт, що менеджер відділу є в той самий час і його співробітником.
c: Компанія
“local”підрозділ
: Відділ
“local”виконує роботу
“self”менеджер
: Співробітник
Рис. 23.9. Графічне зображення зв'язків з різними стереотипами.
Примітка
Оскільки на цій діаграмі відсутні повідомлення, то вона не є, строго кажучи, діаграмою кооперації. Швидше, це спеціальний випадок
489
діаграми класів, який іноді називають діаграмою об'єктів. У разі N- арного зв'язку цей зв'язок зображається аналогічно N-арною асоціацією з використанням символа ромба.
23.4. Повідомлення
Повідомлення, як елементи мови UML, вже розглядалися раніше під час вивчення діаграми послідовності (див. розділ 21). Під час побудови діаграми кооперації вони мають деякі додаткові семантичні особливості. Повідомлення на діаграмі кооперації специфікує комунікацію між двома об'єктами, один з яких передає іншому деяку інформацію. При цьому перший об'єкт чекає, що після отримання повідомлення іншим об'єктом відбувається виконання деякої дії. Отже, саме повідомлення є причиною або стимулом для початку виконання операцій, відсилання сиґналів, створення і знищення окремих об'єктів. Зв'язок забезпечує канал для напрямленого передавання повідомлень між об'єктами від об'єкту-джерела до об'єкту-одержувача.
Повідомлення в мові UML також специфікують ролі, які відіграють об'єкти, – відправник і одержувач повідомлення. Повідомлення на діаграмі кооперації зображаються позначеними стрілками поряд із відповідним зв'язком або роллю асоціації. Напрямок стрілки вказує на одержувача повідомлення. Вигляд стрілки повідомлення має певний сенс. На діаграмах кооперації може використовуватися один із чотирьох типів стрілок для позначення повідомлень (рис. 23.10).
Рис. 23.10. Графічне зображення різних типів повідомлень на діаграмі кооперації.
Суцільна лінія з трикутною стрілкою (рис. 23.10, а) позначає викликання процедури або іншого вкладеного потоку керування. Може бути також використана спільно з паралельно активними об'єктами, коли один з них передає сиґнал і чекає, поки не закінчиться деяка вкладена послідовність дій. Зазвичай всі такі повідомлення є
490
синхронними, тобто ініціюються після закінчення деякої діяльності або при виконанні деякої умови.
Суцільна лінія з V-подібною стрілкою (рис. 23.10, б) позначає простий потік керування. Кожна така стрілка зображає один етап в послідовності потоку керування. Зазвичай всі такі повідомлення є асинхронними.
Суцільна лінія з напівстрілкою (рис. 23.10, в) використовується для позначення асинхронного потоку керування. Відповідні повідомлення формуються в довільні, заздалегідь не відомі моменти часу, як правило, активними об'єктами. Зазвичай повідомлення цього типу є початковими у послідовності потоку керування і найчастіше ініціюються акторами.
Пунктирна лінія з V-подібною стрілкою (рис. 23.10, г) позначає повернення процедури з виклику. Стрілки цього типу часто відсутні на діаграмах кооперації, оскільки неявно передбачається їх існування після закінчення процесу активізації деякої діяльності.
23.4.1. Формат запису повідомлень
Кожне повідомлення може бути позначене рядком тексту, який має такний формат:
< Попередні повідомлення> < [Сторожова умова] > <Вираз послідовності>
<Повернене значення– ім'я повідомлення> <Список арґументів>
Розглянемо кожний з цих елементів детальніше.
Попередні повідомлення – це розділені комами номери повідомлень, записані перед похилою рискою:
<Номер повідомлення ','>< Номер повідомлення,'> '/'
Якщо список номерів повідомлень порожній, то весь запис, включаючи похилу риску (слеш), опускається. Кожний номер повідомлення може бути виразом послідовності без рекурсивних символів. Вираз повинен визначати номер іншого повідомлення в цій послідовності.
Примітка
Зазначимо, що самі номери послідовності повідомлень з однаковим префіксом утворюють відношення впорядкованості і, відповідно, неявно вказують на попередні повідомлення. Таким попереднім повідомленням буде повідомлення з номером, найправіша цифра якого на одиницю менша, ніж у заданого повідомлення. Наприклад, для повідомлення з номером "3.1.4.6" попереднім є повідомлення з номером "3.1.4.5".
