Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

PrIS

.pdf
Скачиваний:
55
Добавлен:
07.12.2018
Размер:
7.24 Mб
Скачать

431

20.3.2. Сторожова умова

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

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

Узагальному випадку з одного стану може бути декілька переходів

зоднією й тією самою подією-триґером. При цьому ніякі дві сторожові умови не повинні одночасно набувати значення "істина". Кожну зі сторожових умов необхідно обчислювати кожен раз при настанні відповідної події-триґера.

Прикладом події-триґера може служити розрив телефонного з'єднання з провайдером Інтернет-послуг після закінчення завантаження електронної пошти клієнтською поштовою програмою (при видаленому доступі до Інтернету). У цьому випадку сторожова умова є не що інше, як відповідь на запитання: "Чи порожня поштова скринька клієнта на сервері провайдера?". У разі позитивної відповіді "істина", треба відключити з'єднання з провайдером, що і робить автоматично поштова програмаклієнт. У разі негативної відповіді "хибність", треба залишатися у стані завантаження пошти й не розривати телефонне з'єднання.

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

432

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

Рис. 20.5. Діаграма станів для моделювання поштової програми-клієнта.

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

Примітка

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

433

Мова йде про те, що в окремих випадках може відбутися рідкісна, але вельми неприємна подія, що отримала назву "залипання модему". Це характерно для ситуації, коли вся пошта завантажена, а автоматичне роз'єднання не відбувається. Проте й цей випадок можна передбачити в нашій моделі, доповнивши діаграму ще одним переходом з аналогічною подією-триґером "закінчити завантаження пошти" і з новою сторожовою умовою. Ця сторожова умова повинна перевіряти максимально допустимий час з'єднання для завантаження пошти (наприклад, 600 секунд) і може бути сформульована у вигляді "час завантаження пошти перевищує 600 секунд"; пропонується самостійно модифікувати діаграму станів для цього випадку як вправу.

20.3.3.Вираз дії

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

врядку тексту, приєднаному до відповідного переходу.

Узагальному випадку, вираз дії може містити цілий список окремих дій, розділених символом ";". Обов'язкова вимога – всі дії зі списку повинні чітко різнитися між собою і слідувати в порядку їх запису. На синтаксис запису виразів дії не накладається ніяких обмежень. Головне – їх запис має бути зрозумілий розробникам моделі і програмістам. Тому найчастіше цей вираз записують на одній з мов програмування, яку передбачається використовувати для реалізації моделі.

Як приклад виразу дії (див. рис. 20.5) може служити "розірвати телефонне з'єднання” (телефонний номер), яка має бути виконана відразу після встановлення істинності ("істина") сторожової умови "поштова скринька на сервері порожня".

Іншим прикладом може служити очевидна ситуація з виділенням графічних об'єктів на екрані монітора при одноразовому натисненні лівої кнопки миші. Мається на увазі опрацювання сиґналів від користувача при виділенні тих чи інших графічних примітивів (піктограм). У цьому випадку відповідний перехід може мати такий рядок тексту: "натиснута і відпущена ліва кнопка миші (координати) [координати в області графічного об'єкту] / виділити об'єкт (колір)”. Результатом цього

434

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

Примітка

Іноді після виразу дії може бути записане повідомлення у форматі: 'Л' <ім'я об'єкту приймача повідомлення> '.' <ім'я посланого повідомлення> '('<параметр>':'<тип>',)'. При цьому повідомлення має чисто інформаційний характер і не передає керування на об'єкт-приймач повідомлення.

20.4. Складений стан і підстан

Складений стан (composite state) – це складний стан, який складається з інших вкладених у нього станів. Останні виступатимуть по відношенню до першого як підстани (substate). Хоча між ними має місце відношення композиції, графічно всі вершини діаграми, які відповідають вкладеним станам, зображаються всередині символа складеного стану (рис. 20.6). У цьому випадку розміри графічного символа складеного стану збільшуються, так щоб вміщувати в себе всі підстани.

Рис. 20.6. Графічне зображення складеного стану з двома вкладеними в нього послідовними підстанами.

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

20.4.1. Послідовні підстани

435

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

Для прикладу розглянемо звичайний телефонний апарат. Він може перебувати в різних станах, одним з яких є стан телефонування до абонента. Очевидно, щоб зателефонувати, необхідно зняти телефонну трубку, почути тоновий сигнал, після чого набрати потрібний телефонний номер. Отже, стан телефонування до абонента є складеним і передбачає два послідовних підстани: "підняти телефонну трубку" і "набрати телефонний номер". Фраґмент діаграми станів для цього прикладу містить один складений стан і два послідовних підстани (рис. 20.7).

Рис. 20.7. Приклад складеного стану з двома вкладеними послідовними підстанами.

Два переходи специфікують подію-триґер – набір цифри, яка має ім'я "цифра" з параметром "n". Як параметр виступає окрема цифра на диску телефонного апарату. Перехід з початкового підстану є нетриґерним, оскільки він не містить ніякого рядка тексту. Останній перехід у кінцевий підстан не має події-триґера, але має сторожову умову, перевіряючи правильність набраного номера абонента. Тільки в разі істинності цієї умови телефонний апарат може перейти в кінцевий підстан, який характеризує суперстан "телефонування до абонента" загалом.

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

436

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

Це можна пояснити таким чином. Кожна сукупність вкладених послідовних підстанів є підавтоматом того автомата, до якого належить цей складений стан. Оскільки кожен автомат може мати за визначенням єдиний початковий і єдиний кінцевий стани, то для підавтомата ця умова також повинна виконуватися (рис. 20.7).

20.4.2. Паралельні підстани

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

Проте окремі паралельні підстани можуть, своєю чергою, складатися з декількох послідовних підстанів (підавтомати 1 і 2 на рис. 20.8). У цьому випадку за визначенням об'єкт може перебувати тільки в одному з послідовних підстанів підавтомата. Отже, для абстрактного прикладу (рис. 20.8) допустиме одночасне перебування об'єкту в підстанах (1, 3, 4) (2, 3, 4) (1, 3, 5) (2, 3, 5). Неприпустимо знаходження об'єкту одночасно в підстанах (1, 2, 3) або (3, 4, 5).

Рис. 20.8. Графічне зображення складеного стану із вкладеними паралельними підстанами.

437

Оскільки кожен реґіон вкладеного стану специфікує деякий підавтомат, то для кожного із вкладених підавтоматів можуть бути визначені власні початкові і кінцеві підстани (рис. 20.8). При переході в такий складений стан кожний з підавтоматів опиняється у своєму початковому підстані. Далі відбувається паралельне виконання кожного з цих підавтоматів, причому вихід зі складеного стану буде можливий лише в тому випадку, коли всі підавтомати перебувтимуть у своїх кінцевих підстанах.

Якщо який-небудь з підавтоматів поторапив у свій кінцевий стан раніше за інших, то він повинен чекати, поки й інші підавтомати не потраплять в свої кінцеві стани.

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

Рис. 20.9. Складений стан з прихованою внутрішньою структурою і спеціальною піктограмою.

20.5. Історичний стан

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

438

Історичний стан (history state) застосовується в контексті складеного стану. Він використовується для запам'ятовування того з послідовних підстанів, який був поточним у момент виходу зі складеного стану. При цьому існує два різновиди історичного стану: недавній і давній

(рис. 20.10).

Рис. 20.10. Графічне зображення недавнього (а) і давнього (б) історичного стану.

Недавній історичний стан (shallow history state) позначається у формі невеликого кола, у яке вміщена латинська літера "Н" (рис. 20.10, а). Цей стан має таку семантику. По-перше, він є першим підстаном у складеному стані, і перехід ззовні в цей складений стан повинен вести безпосередньо в цей історичний стан. По-друге, при першому потраплянні в недавній історичний стан воно не зберігає ніякої історії (історія порожня). Іншими словами, при першому переході в недавній історичний стан він замінює собою початковий стан підавтомата.

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

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

Стан, що запам'ятав, своєю чергою, також може бути складеним станом. Давній історичний стан (deep history state) позначається у формі невеликого кола, в яке вміщена латинська літера "Н" із символом "*" (рис. 20.10, б) і служить для запам'ятовування всіх підстанів будь-якого рівня вкладеності для поточного підавтомата.

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

439

фраґмент тексту. Поштова програма може бути конфіґурована таким чином, що у фіксовані моменти часу (наприклад, кожні 30 хвилин) вона перевіряє наявність нових повідомлень на сервері провайдера при видаленому доступі. Очевидно, що чергове з’єднання, хоча і перериває роботу редактора, не повинен привести до втрати набраного фраґменту тексту.

У цьому випадку складений стан "робота редактора" повинен містити вкладений історичний підстан, який запам'ятовує виконану роботу. Після закінчення з’єднання й завантаження нової пошти (у разі її наявності) ми повинні повернутися до збереженого фраґменту нашого повідомлення й продовжити роботу редактора програми.

Діаграма станів поштової програми-клієнта (див. рис. 20.5) може бути доповнена із врахуванням розглянутого аспекту її поведінки. Читачеві пропонується виконати це самостійно як вправу.

20.6. Складні переходи

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

20.6.1. Переходи між паралельними станами

В окремих випадках перехід може мати декілька станів-джерел і декілька цільових станів. Такий перехід отримав спеціальну назву – паралельний перехід. Уведення в розгляд паралельного переходу обумовлене необхідністю синхронізувати і/або розділити окремі підпроцеси на паралельне виконання без специфікації додаткової синхронізації в паралельних підавтоматах.

Графічно такий перехід зображається вертикальною рискою, аналогічно до позначення переходу у відомому формалізмі мереж Петрі. Якщо паралельний перехід має дві або більше вхідних дуг (рис. 20.11, а), то його називають з'єднанням (join). Якщо ж він має дві або більше вихідних з нього дуг (рис. 20.11, б), то його називають розгалуженням (fork). Текстовий рядок специфікації паралельного переходу записується поряд з рискою і відноситься до всіх вхідних (вихідних) дуг.

440

Рис. 20.11. Графічне зображення паралельного переходу з паралельних станів (а) і паралельного переходу в паралельні стани (б).

Спрацьовування паралельного переходу відбувається таким чином. У першому випадку (перехід-з'єднання) перехід спрацьовує, якщо має місце подія-триґер для всіх початкових станів цього переходу, і виконана (при її наявності) сторожова умова. При спрацьовуванні переходу- з'єднання одночасно покидаються всі початкові стани переходу (стани 1 і 2) і відбувається перехід в цільовий стан. При цьому кожний з початкових станів переходу має належати до окремого підавтомата, що входить до складу автомата (процесу 1).

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

20.6.2. Переходи між складеними станами

Перехід, стрілка якого з’єднана з межею деякого складеного стану, позначає перехід у складений стан (перехід b на рис. 20.12). Він еквівалентний переходу в початковий стан кожного з підавтоматів (можливо, єдиному), що входять до складу такого суперстану. Перехід, що виходить зі складеного стану (переходи f і g на рис. 20.12), відноситься до кожного із вкладених підстанів. Це означає, що об'єкт може покинути складений суперстан, перебуваючи в будь-якому з його підстанів. Для цього цілком достатньо виконання події і сторожової умови.