Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Моделирование и анализ ПО - 1.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1 Мб
Скачать
☆

1.2.3 Концепція зв’язку та асоціації

1.2.3.1 Зв’язки та асоціації

Зв'язки і асоціації дозволяють встановлювати відносини між об'єктами та класами.

Зв'язок (link) - це фізичне або концептуальне з'єднання між об'єктами. У більшості випадків зв'язок з'єднує рівно два об'єкти, але бувають зв'язки, які з’єднують більшу кількість об'єктів.

Асоціація (association) - це опис групи зв'язків, що володіють загальною структурою і загальною семантикою. Зв'язки, які є екземплярами деякої асоціації, з'єднують об'єкти тих класів, які з'єднані між собою цією асоціацією. Асоціація описує множину потенційних зв'язків так само, як клас описує множину потенційних об'єктів. Зв'язки і асоціації зазвичай присутні в постановці завдання у вигляді дієслів.

Система графічних позначень UML вказує зображати зв'язок як лінію між двома об'єктами. Лінія може складатися з кількох прямолінійних сегментів. Якщо у зв'язку є ім'я, воно підкреслюється. Асоціація поєднує між собою класи і теж позначається лінією (яка теж може мати кілька прямолінійних сегментів). Назви зв'язків та асоціацій виділяються курсивом, а сегменти ліній прив'язуються до прямокутної сітки. Рекомендується розставляти класи так, щоб асоціація читалася зліва направо як наведено на рис. 1.2.2.

Назву асоціації вказувати не обов'язково, якщо в моделі не виникає двозначності. Неоднозначність виникає в тих випадках, коли між одними і тими ж класами існує кілька асоціацій.

Асоціації за своєю сутністю є двосторонніми. Назва бінарної асоціації зазвичай читається в конкретному напрямку, але сама асоціація може бути простежена в будь-якому напрямку.

Розробники часто реалізують асоціації у вигляді посилань з одного об'єкта на інший. Посилання (reference) - це атрибут об'єкта, який посилається на інший об'єкт. Наприклад, структура даних класу Person (Людина) може містити атрибут employer (роботодавець), який посилається на об'єкт класу Company (Компанія), а об'єкт класу Company може містити атрибут employees (співробітники), який посилається на множину об'єктів класу Person. Реалізація асоціацій у вигляді посилань цілком допустима, але моделювати асоціації таким чином не слід.

Рисунок 1.2.2 – Приклад зв’язку "Односпрямована асоціація"

1.2.3.2 Види асоціацій

Класи рідко бувають ізольовані, найчастіше вони взаємодіють один з одним. Ці взаємодії показуються за допомогою різного виду зв'язків. Типи зв'язків впливають на вихідний код, який генерується на основі діаграм, тому розглянемо зв'язки та специфікації більш докладно.

У діаграмі класів використовуються наступні види зв'язків:

  • Unidirectional Association (односпрямована асоціація);

  • Dependency (залежність);

  • Association Class (асоційований клас);

  • Generalization (спадкування);

  • Realization (реалізація).

Unidirectional Association (односпрямована асоціація). Це один з важливих і складних типів зв'язку, який використовується в діаграмі класів. Даний зв'язок показує, що один клас включається в інший як атрибут за посиланням або за значенням (рис. 1.2.2).

Для включення в клас змінної простого типу треба використовувати завдання атрибутів, а при необхідності включення в клас змінної зі складним типом (наприклад, класа або структури), треба використовувати односпрямовану асоціацію.

Наведений далі лістинг показує код C++, який був створений для приклада зв'язку зображеного на рис. 1.2.2.

class Class2;

class Classl { public: Class2 * theClass2; };

Rational Rose створює код класу залежно від встановлених специфікацій зв'язку, тому розглянемо вплив різних установок специфікацій на одержуваний код. При натисканні правої кнопки миші на зв'язку активізується контекстне меню, яке надає швидкий доступ до установок зв'язку. Проте специфікації зв'язку дозволяють виконати те ж саме за допомогою вкладок діалогових вікон. Активізуйте вікно специфікацій за допомогою контекстного меню або подвійного натискання миші на стрілці асоціації, при цьому відкривається вкладка General специфікацій (рис. 1.2.3).

Рисунок 1.2.3 – Вкладка General специфікацій Unidirectional Association

Вкладка General - показує інформацію про ім'я, стереотипи, батьківський клас і іншу основну інформацію про зв'язок.

Name (ім'я) – задає ім'я зв'язку. Для кожного зв'язку може бути, хоча і необов'язково, задано ім'я, яке одним словом або цілої фразою вказує мету або семантику зв'язку;

Parent (батьківський) – вказує ім'я пакету, якому належить зв'язок;

Stereotype (стереотип) – вказує стереотип. Стереотип дозволяє вказувати додаткові особливості для розроблюваної моделі, які не підтримуються мовою UML. Поняття стереотипу дозволяє легшее додавати інформацію в нові елементи моделі шляхом вибору стереотипу для цих елементів із вже заданих і являє собою додаткову класифікацію елементів. Деякі стереотипи вже визначені в Rational Rose, але завжди можна додати нові стереотипи користувача, опис яких зберігається у файлі стереотипів DefaultStereotypes.ini. Стереотип може бути показаний для класу або прихований за допомогою пункту Options => Stereotype Display контекстного меню класу. Ось список деяких стереотипів, доступних в Rational Rose (рис 1.2.4):

  • Actor (виконавець);

  • boundary (кордон);

  • Business Actor (бізнес-виконавець);

  • Business Document (бізнес-документ);

  • Business Entity (бізнес-сутність);

  • control (управління);

  • interface (інтерфейс);

  • Physical Worker (робітник).

Рисунок 1.2.4 – Стереотипи класів

Role A / Role B – вказує ім'я ролі, з якою один клас асоціюється з іншим;

Element A/ Element B – вказує ім'я класу, який асоційований з даною роллю.

Вкладка Detail - вказує додаткові властивості зв'язку (рис. 1.2.5).

Рисунок 1.2.5 – Вкладка Detail специфікацій Unidirectional Association

Link Element – вказує асоційований клас, якщо зв'язок з'єднаний з ним асоціацією;

NameDirection – вказує ім'я пов'язаного класу;

Constraints – вказує вираз деякої семантичної умови, що має бути виконана, в той час як система перебуває в стійкому стані. Це поле застосовується до зв'язку в цілому, в той час як обмеження, зазначене у цій вкладці, застосовується безпосередньо до даної ролі.

Вкладка Role Genera - відображає налаштування змінної, яка буде включена в клас (рис. 1.2.6).

Рисунок 1.2.6 – Вкладка Role A General специфікацій Unidirectional Association

Вкладка Role А Detail - деталізує установки для зв'язку (рис. 1.2.7). Вона має наступні поля:

Role – дозволяє задавати ім'я змінної класу;

Element – показує ім'я класу, для якого створюється змінна;

Constraints – вказує вираз деякої семантичної умови, що має бути виконана в той час, як система перебуває в стійкому стані. При завданні обмеження воно буде показано на діаграмі у фігурних дужках. Причому на сгенерованому коді це обмеження не буде відображатися.

Multiplicity показує, скільки об'єктів даного класу очікується створити. Може бути задано числом або буквою «n». Значення «n» вказує, що кількість нелімітовано. Можна задати різні варіанти очікуваної кількості або діапазон. Причому, вказане число відображається поруч зі стрілкою зв'язку.

Рисунок 1.2.7 – Вкладка Role A Detail специфікацій Unidirectional Association

Navigable показує напрямок, в якому діє зв'язок. При установці цього прапорця зв'язок набуває вигляду стрілки, що вказує напрям зв'язку. Це поле безпосередньо впливає на створюваний код класу, так як на який клас буде направлена ​​стрілка зв'язку, той і буде включений в інший. Для того щоб змінити напрям зв'язку, досить зняти прапорець з вкладки Role A Detail і встановити його у вкладці Role B Detail. При цьому у випадку, коли зняті прапорці на обох вкладках жоден елемент не буде включений в інший. При цьому на діаграмі буде показана просто лінія (рис. 12.8).

Рисунок 1.2.8 – Приклад не спрямованого зв’язку

Aggregate показує, що один клас не просто використовує, а містить інший. Для того щоб показати, що клас Class2 входить до класу Class 1, необхідно встановити цей прапорець у вкладці Role B Detail. При цьому стрілка зв'язку на діаграмі набуває ромб зі зворотного боку стрілки (рис. 1.2.9).

Рисунок 1.2.9 – Приклад агрегування класу

Агрегація означає фізичне включення пов'язаного класу в інший клас. При цьому генератор коду мови C++ Rational Rose створює код, наведений на лістингу.

class Class2; class Class1

{

public: Class2 theClass2; };

Зауваження. Агрегація може бути включена тільки для однієї вкладки або для Role А, або для Role B, але не одночасно.

Static позначає, що даний реквізит – спільний для всіх об'єктів даного класу. Причому після ініціалізації до нього можна звертатися, навіть якщо ще не було створено жодного об'єкта класу. Static застосовується для того, щоб змінні такого типу не тиражувалися при створенні нового об'єкта класу. Наприклад, якщо необхідно точно знати, скільки об'єктів класу створено, то можна доручити самому класу слідкувати за цим числом, створивши в ньому змінну типу static int iCnt, видиму в усіх об'єктах класу;

Friend визначає, що вказаний клас є дружнім класом, тобто має доступ до захищених методів і атрибутів класу.

Зауваження. Якщо прапорець встановити, а потім зняти, а між цими операціями оновити код за моделлю, то потім необхідно вручну видалити з коду класу рядок friend.

Key / qualifier – атрибут, який унікальним чином ідентифікує одиничний об'єкт. На генерацію коду впливу не має.

Association Class (асоційований клас). Цей тип зв'язку використовується для відображення властивості асоціації. Властивості зберігаються в класі і з'єднуються зв'язком Association (рис. 1.2.10). Цей тип зв'язку не має своїх специфікацій. У загальному вигляді асоціація призначена для завдання додаткових атрибутів у зв'язку. Фактично даний тип зв'язку означає, що певний клас зі своїми атрибутами включається як елемент в два інших, хоча, як не дивно, при генерації коду це не відображається.

Рисунок 1.2.10 – Приклад зв'язку "Асоційований клас"

Dependency of instances (залежність реалізації). Цей тип зв'язку дозволяє показати, що один клас використовує об'єкти іншого. Використання може здійснюватися при передачі параметрів або виклику операцій класу. У цьому випадку генератор коду C++ Rational Rose включає заголовки в клас, який використовує оператори або об'єкти іншого класу. Графічно цей вид зв'язку відображається пунктирною стрілкою (рис. 1.2.11).

Рисунок 1.2.11 – Приклад зв’язку "Залежність реалізації"

Generalization (спадкування). Даний тип зв'язку дозволяє вказати, що один клас є батьківським по відношенню до іншого, при цьому буде створено код успадкування класу. Приклад такого зв'язку зображений на рис. 1.2.12.

Рисунок 1.2.12 – Приклад зв’язку "Спадкування"

Далі наведений лістинг, отриманий при генерації коду для показаного прикладу.

# include "Classl.h";

class Class2: public Classl

{ };

Realization (реалізація)

Даний тип зв'язку дозволяє показати, що один клас є реалізацією, тобто створений на основі шаблону іншого (рис. 1.2.16).

Рисунок 1.2.16 – Приклад зв’язку Realization

У C++ широко використовується поняття шаблон (template), що означає клас, на основі якого створюється ціле сімейство класів, поведінка яких визначається поведінкою шаблону, проте тип даних, з яким буде працювати створений на його основі клас, визначається параметром шаблона. У Rational Rose для позначення класу шаблону використовується поняття Parameterized Class (параметризований клас). Його можна створити за допомогою спеціального значка, який необхідно включити до рядка інструментів, або у вікні специфікацій класу на вкладці General змінити його тип на ParameterizedClass.

Графічно шаблон зображається прямокутником, до верхнього правого кута якого приєднаний маленький прямокутник з пунктирних ліній (рис. 1.2.17). У верхньому прямокутнику вказується список формальних параметрів для тих класів, які можуть бути одержані на основі даного шаблону. Завдання формальних параметрів виконується у вікні специфікацій класу на вкладці Detail у полі Formal Arguments.

Рисунок 1.2.17 – Графічне зображення шаблону на діаграмі класів