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

5.1. Клас

Клас (class) в язиці UML служить для позначення безлічі об'єктів, які володіють однаковою структурою, поведінкою і відносинами з об'єктами з інших класів. Графічно клас зображається у вигляді прямокутника, який додатково може бути роздільний горизонтальними лініями на розділи або секції (мал. 5.1). В цих розділах можуть указуватися ім'я класу, атрибути (змінні) і операції (методи).

Мал. 5.1. Графічне зображення класу на діаграмі класів

Обов'язковим елементів позначення класу є його ім'я. На початкових етапах розробки діаграми окремі класи можуть позначатися простим прямокутником з вказівкою тільки імені відповідного класу (мал. 5.1, а). У міру опрацьовування окремих компонентів діаграми опису класів доповнюються атрибутами (мал. 5.1, би) і операціями (мал. 5.1, в).

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

Навіть якщо секція атрибутів і операцій є порожньою, в позначенні класу вона виділяється горизонтальною лінією, щоб відразу відрізнити клас від інших елементів язика UML. Приклади графічного зображення класів на діаграмі класів приведені на мал. 5.2. В першому випадку для класу «Прямокутник» (мал. 5.2, а) вказані тільки його атрибути – крапки на координатній площині, які визначають той, що його розташовує. Для класу «Вікно» (мал. 5.2, би) вказані тільки його операції, секція атрибутів залишена порожньою. Для класу «Рахівниць» (мал. 5.2, в) додатково зображена четверта секція, в якій вказано виключення – відмова від обробки простроченої кредитної картки.

Рис.5.2. Приклади графічного зображення класів на діаграмі

Ім'я класу

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

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

Прикладами імен класів можуть бути такі іменники, як «Співробітник», «Компанія», «Керівник», «Клієнт», «Продавець», «Менеджер», «Офіс» і багато інших, що мають безпосереднє відношення до модельованої наочної області і функціонального призначення проектованої системи.

Клас може не мати екземплярів або об'єктів. В цьому випадку він називається абстрактним класом, а для позначення його імені використовується похилий шрифт (курсив). В язиці UML прийнята загальна угода про те, що будь-який текст, що відноситься до абстрактного елемента, записується курсивом. Дана обставина є семантичним аспектом опису відповідних елементів язика UML.

Примітка

В деяких випадках необхідно явно вказати, до якого пакету відноситься той або інший клас. Для цієї мети використовується спеціальний символ роздільник – подвійна двокрапка"::". Синтаксис рядка імені класу в цьому випадку буде наступний ‹Имя_пакета‑ ::‹Имя_класса‑ . Іншими словами, перед ім'ям класу повинно бути явно вказано ім'я пакету, до якого його слід віднести. Наприклад, якщо визначений пакет з ім'ям «Банк», то клас «Рахівниць» в цьому банку може бути записаний у вигляді: «банк::Счет».

Атрибути класу

В другій зверху секції прямокутника класу записуються його атрибути (attributes) або властивості. В язиці UML прийнята певна стандартизація запису атрибутів класу, який підкоряється деяким синтаксичним правилам. Кожному атрибуту класу відповідає окремий рядок тексту, який складається з квантора видимості атрибута, імені атрибута, його кратності, типу значень атрибута і, можливо, його початкового значення:

‹квантор видимости‑ ‹имя атрибута‑ [кратність]:

‹тип атрибута‑ = ‹початкове значение‑ {рядок‑ властивість}

Квантор видимості може приймати одне з трьох можливих значень і, відповідно, відображається за допомогою спеціальних символів:

Символ "+" позначає атрибут з областю видимості типу загальнодоступний (public). Атрибут з цією областю видимості доступний або видний з будь-якого іншого класу пакету, в якому визначена діаграма.

Символ "#" позначає атрибут з областю видимості типу захищений (protected). Атрибут з цією областю видимості неприступний або невидний для всіх класів, за винятком підкласів даного класу.

І, нарешті, знак «‑ » позначає атрибут з областю видимості типу закритий (private). Атрибут з цією областю видимості неприступний або невидний для всіх класів без виключення.

Квантор видимості може бути опущений. В цьому випадку його відсутність просто означає, що видимість атрибута не указується. Ця ситуація відрізняється від прийнятих за умовчанням угод в традиційних язиках програмування, коли відсутність квантора видимості потрактує як public або private. Проте замість умовних графічних позначень можна записувати відповідне ключове слово: public, protected, private.

Примітка

Оскільки язик UML інваріантний щодо реалізації своїх конструкцій в конкретних язиках програмування, семантика окремих кванторів видимості не є строго фіксованою. Значення цих кванторів повинні додатково уточнюватися текстом пояснення на природному язиці або угодою по використовуванню відповідних програмно‑ залежних синтаксичних конструкцій.

Ім'я атрибута є рядком тексту, який використовується як ідентифікатор відповідного атрибута і тому повинна бути унікальною в межах даного класу. Ім'я атрибута є єдиним обов'язковим елементом синтаксичного позначення атрибута.

Кратність атрибута характеризує загальну кількість конкретних атрибутів даного типу, що входять до складу окремого класу. В загальному випадку кратність записується у формі рядка тексту в квадратних дужках після імені відповідного атрибута:

[нижняя_граница1. верхняя_граница1, нижняя_граница2. верхняя_грашца2. нuжняя_гpaнuцak. верхняя_границаk]

де нижняя_граница і верхняя_граница є позитивними цілими числами, кожна пара яких служить для позначення окремого замкнутого інтервалу цілих чисел, у якого нижня (верхня) межа рівна значенню нижняя_граница (верхняя_граница). В цілому дане умовне позначення кратності відповідає теоретико‑ множинному об'єднанню відповідних інтервалів. Як верхней_границы може використовуватися спеціальний символ "*", який означає довільне позитивне ціле число. Іншими словами, це означає необмежене зверху значення кратності відповідного атрибута.

Значення кратності з інтервалу слідують в монотонно зростаючому порядку без пропуску окремих чисел, що лежать між нижньою і верхньою межами. При цьому дотримуються наступного правила: відповідні нижні і верхні межі інтервалів включаються в значення кратності. Якщо як кратність указується однина, то кратність атрибута приймається рівною даному числу. Якщо ж указується єдиний знак "*", то це означає, що кратність атрибута може бути довільним позитивним цілим числом або нулем.

Як приклад розглянемо наступні варіанти завдання кратності атрибутів.

[0.1] означає, що кратність атрибута може приймати значення Про або 1. При цьому 0 означає відсутність значення для даного атрибута.

[0.*] означає, що кратність атрибута може приймати будь-яке позитивне ціле значення більше або рівне 0. Ця кратність може бути записана коротше у вигляді простого символу – [*].

[1.:*] означає, що кратність атрибута може приймати будь-яке позитивне ціле значення більше або рівне 1.

[1.5] означає, що кратність атрибута може приймати будь-яке значення з чисел: 1, 2, 3, 4, 5.

[1.3,5,7] означає, що кратність атрибута може приймати будь-яке значення з чисел: 1, 2, 3, 5, 7.

[1.3,7. 10] означає, що кратність атрибута може приймати будь-яке значення з чисел: 1, 2, 3, 7, 8, 9, 10.

[1.3,7.*] означає, що кратність атрибута може приймати будь-яке значення з чисел: 1, 2, 3, а також будь-яке позитивне ціле значення більше або рівне 7.

Якщо кратність атрибута не вказана, то за умовчанням приймається її значення рівне 1.1, т.  е. в точності 1.

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

Можна привести наступні приклади завдання імен і типів атрибутів класів:

колір: Соlоr – тут колір є ім'ям атрибута, Color – ім'ям типу даного атрибута. Вказаний запис може визначати RGB‑ модель (червоний, зелений, синій), що традиційно використовується, для представлення кольору. В цьому випадку ім'я типа Color якраз і характеризує семантичну конструкцію, яка застосовується в більшості язиків програмування для представлення кольору.

имя_сотрудника [1.2]: String – тут имя_сотрудника є ім'ям атрибута, який служить для уявлення інформації про ім'я, а можливо, і по батькові конкретного співробітника. Тип атрибута String (Рядок) якраз і указує на той факт, що окреме значення імені є рядком тексту з одного або двох слів (наприклад, «Кирило» або «Дмитро Іванович»). Оскільки в багатьох язиках програмування існує тип даних String, використовування відповідного англомовного терміну не викликає непорозуміння у більшості програмістів. Проте, хоча в язиці UML всі терміни даються в англомовному уявленні, використовування як тип атрибута Рядок в даній ситуації не виключається і визначається тільки міркуваннями зручності.

видимість: Boolean – тут видимість є ім'я абстрактного атрибута (курсив тут не випадковий), який може характеризувати наявність візуального представлення відповідного класу на екрані монітора. В цьому випадку тип Boolean означає, що можливими значеннями даного атрибута є одне з двох логічних значень: істина (true) або брехня (false). При цьому значення істина може відповідати наявності графічного зображення на екрані монітора, а значення брехня – його відсутності, про що додатково указується в тексті пояснення. Оскільки кратність атрибута видимість не вказана, вона приймає значення 1 за умовчанням. В цій ситуації англомовне ім'я типу атрибута цілком виправдано наявністю відповідного базового типу в язиках програмування. Абстрактний характер даного атрибута позначається курсивним текстом в записі даного атрибута.

форма: Багатокутник – тут ім'я атрибута форма може характеризувати такий клас, який є геометричною фігурою на площині. В цьому випадку тип атрибута Багатокутник указує на той факт, що окрема геометрична фігура може мати форму трикутника, прямокутника, ромба, п'ятикутника і будь-якого іншого багатокутника, але не кола або еліпса. Цілком очевидно, що в даній ситуації використовування відповідного англомовного терміну навряд чи доцільне, оскільки тип Многоугольник не є базовим для язиків програмування.

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

Як приклади початкових значень атрибутів можна привести наступні доповнені вище варіанти завдання атрибутів:

колір: Соlоr = (255, 0, 0) – в RGB‑ моделі кольору це відповідає чистому червоному кольору як початкове значення для даного атрибута.

имя_сотрудника[1.2]: String = Іван Іванович – можливо, це нетиповий випадок, який, швидше, відповідає ситуації имя_руководителя[2]:81пп§ = Іван Іванович.

видимість: Вооlеаn = істина – може відповідати ситуації, коли у момент створення екземпляра класу створюється видиме на екрані монітора вікно, відповідне даному об'єкту.

форма: Багатокутник = прямокутник – навряд чи вимагає коментарів, оскільки тут йдеться про геометричну форму створюваного об'єкту.

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

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

Наприклад, якщо деякий атрибут заданий у вигляді форма: Прямокутник. то це означатиме, що всі об'єкти даного класу можуть мати декілька різних форм, кожна з яких є прямокутником. Іншим прикладом може служити завдання атрибута у вигляді номер_счета: Integer. що може означати для об'єкту Співробітник наявність деякої підмножини рахунків, загальна кількість яких наперед не фіксується.

Рядок‑ властивість служить для вказівки значень атрибута, які не можуть бути змінені в програмі при роботі з даним типом об'єктів. Фігурні дужки якраз і позначають фіксоване значення відповідного атрибута для класу в цілому, яке повинні приймати всі знов створювані екземпляри класу без виключення. Це значення приймається за початкове значення атрибута, яке не може бути перевизначене в подальшому. Відсутність рядка‑ властивості за умовчанням потрактує так, що значення відповідного атрибута може бути змінено в програмі. Наприклад, рядок‑ властивість в записі атрибута заработная_плата: Currency = = {$500} може служити для позначення фіксованої заробітної платні для кожного об'єкту класу «Співробітник» певній посаді в деякій організації. З другого боку, запис даного атрибута у вигляді зара‑ ботная_плата: Currency = $500 означає вже щось інше, а саме – при створенні нового екземпляра Співробітник (аналогія – прийом на роботу нового співробітника) для нього встановлюється за умовчанням заробітна платня в $500. Проте для окремих співробітників можуть бути зроблені виключення як у велику, так і в меншу сторону, про що необхідно поклопотатися додатково в програмі.

Операція

В третій зверху секції прямокутника записуються операції або методи класу. Операція (operation) є деяким сервісом, що надає кожний екземпляр класу по певній вимозі. Сукупність операцій характеризує функціональний аспект поведінки класу. Запис операцій класу в язиці UML також стандартизована і підкоряється певним синтаксичним правилам. При цьому кожній операції класу відповідає окремий рядок, який складається з квантора видимості операції, імені операції, вирази типу значення, що повертається операцією, і, можливо, рядок‑ властивість даної операції:

‹квантор видимости‑ ‹имя операции‑ (список параметрів):

‹вираз типу значения‑ {рядок‑ властивість}, що повертається

Квантор видимості, як і у разі атрибутів класу, може приймати одне з трьох можливих значень і, відповідно, відображається за допомогою спеціального символу. Символ "+" позначає операцію з областю видимості типу загальнодоступний (public). Символ "#" позначає операцію з областю видимості типу захищений (protected). І, нарешті, символ «‑ » використовується для позначення операції з областю видимості типу закритий (private).

Квантор видимості для операції може бути опущений. В цьому випадку його відсутність просто означає, що видимість операції не указується. Замість умовних графічних позначень також можна записувати відповідне ключове слово: public, protected, private.

Примітка

Стосовно конкретних язиків програмування можуть бути визначені додаткові квантори видимості. В цьому випадку подібні доповнення є розширенням базової нотації і вимагають відповідних пояснень у формі тексту на природному язиці або у вигляді рядка‑ властивості.

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

Список параметрів є переліком розділених комі формальних параметрів, кожний з яких може бути представлений в наступному вигляді:

‹вид параметра‑ ‹имя параметра‑ :‹выражение типа‑ =‹значение параметра по умолчанию‑ .

Тут вид параметра – є одне з ключових слів in, або inout із значенням in за умовчанням, у випадку якщо вид параметра не указується. Ім'я параметра є ідентифікатор відповідного формального параметра. Вираз типу є залежним від конкретного язика програмування специфікацією типу значення, що повертається, для відповідного формального параметра. Нарешті, значення за умовчанням в загальному випадку є виразом для значення формального параметра, синтаксис якого залежить від конкретного язика програмування і підкоряється прийнятим в ньому обмеженням.

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

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

Операція з областю дії на весь клас показується підкресленням імені і рядка виразу типу. За умовчанням під областю операції розуміється об'єкт класу. В цьому випадку ім'я і рядок виразу типу операції не підкреслюються.

Операція, яка не може змінювати стан системи і, відповідно, не має ніякого побічного ефекту, позначається рядком‑ властивістю «{запит}» («{query}»). Інакше операція може змінювати стан системи, хоча немає ніяких гарантій, що вона буде це робити.

Для підвищення продуктивності системи одні операції можуть виконуватися паралельно або одночасно, а інші – тільки послідовно. В цьому випадку для вказівки паралелі виконання операції використовується рядок‑ властивість вигляду «{concurrency = ім'я}», де ім'я може приймати одне з наступних значень: послідовна (sequential), паралельна (concurrent), охороняється (guarded). При цьому дотримуються наступної семантики для даних значень:

послідовна (sequential) – для даної операції необхідно забезпечити її єдине виконання в системі, одночасне виконання інших операцій може привести до помилок або порушень цілісності об'єктів класу.

паралельна (concurrent) – дана операція через свої особливості може виконуватися паралельно з іншими операціями в системі, при цьому паралель повинна підтримуватися на рівні реалізації моделі.

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

З метою скорочення позначень допускається використовування одного імені як рядок‑ властивість для вказівки відповідного значення паралелі. Відсутність даного рядка‑ властивості означає, що семантика паралелі для операції не визначена. Тому слід припустити гірший з погляду продуктивності випадок, коли дана операція вимагає послідовного виконання.

Поява сигнатури операції на самому верхньому рівні оголошує цю операцію на весь клас, при цьому дана операція успадковується всіма нащадками даного класу. Якщо в деякому класі операція не виконується (т.  е. деякий метод не застосовується), то така операція може бути помічена як абстрактна «{abstract}». Інший спосіб показати абстрактний характер операції – записати її сигнатуру курсивом. Підлегла поява запису даної операції без властивості {абстрактна} указує на той факт, що відповідний клас‑ нащадок може виконувати дану операцію як свій "метод.

Якщо для деякої операції необхідно додатково вказати особливості її реалізації (наприклад, алгоритм), то це може бути зроблено у формі примітки, записаної у вигляді тексту, який приєднується до запису операції у відповідній секції класу. Якщо об'єкти класу приймають і реагують на деякий сигнал, то запис даної операції позначається ключовим словом «сигнал» («signal»). Це позначення рівнозначне позначенню деякої операції. Реакція об'єкту на прийом сигналу може бути показана у вигляді деякого автомата. Окрім інших випадків ця нотація може бути використана, щоб показати реакцію об'єктів класу на помилкові ситуації або виключення, які можуть моделюватися як сигнали або повідомлення.

Поведінка операції може бути вказане додатково у формі приєднаної до операції примітки. В цьому випадку текст примітки полягає в дужки, якщо він є формальною специфікацією на деякому язиці програмування і відповідає елементу «семантичне обмеження язика UML». Інакше текст примітки є простим описом на природному язиці і позначається прямокутником з «заломленим» верхнім правим кутом (див. розділ 4).

Список формальних параметрів і тип значення, що повертається, можуть не указуватися. Квантор видимості атрибутів і операцій може бути вказаний у вигляді спеціального значка або символу, які використовуються для графічного представлення моделей в деякому інструментальному засобі. Імена операцій, так само як і атрибутів, записуються з рядкової (малої) букви, а їх типи – із заголовної (великий) букви. При цьому обов'язковою частиною рядка запису операції є наявність імені операції і круглих дужок.

Як приклади запису операцій можна привести наступні позначення окремих операцій:

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

+нарисовать(форма: Багатокутник = прямокутник, цвет_заливки: Color = (О, Про, 255)) – може позначати операцію по зображенню на екрані монітора прямокутної області синього кольору, якщо не указуються інші значення як аргументи даної операції.

запросить_счет_клиента(номер_счета:1п1е§ег):Сиггепсу – позначає операцію по встановленню наявності засобів на поточному рахунку клієнта банку. При цьому аргументом даної операції є номер рахунку клієнта, який записується у вигляді цілого числа (наприклад, «123456»). Результатом виконання цієї операції є деяке число, записане в прийнятому грошовому форматі (наприклад, $1,500.00).

выдать_сообщение():{"помилка розподілу на нуль"} – значення даної операції не вимагає пояснення, оскільки міститься в рядку‑ властивості операції. Дане повідомлення може з'явитися на екрані монітора у разі спроби розподілу деякого числа на нуль, що неприпустимо.