
6.6. Складні переходи
Розглянуте поняття переходу є цілком достатнім для більшості типових розрахунково-обчислювальних завдань. Проте сучасні програмні системи можуть реалізовувати дуже складну логіку поведінки окремих своїх компонентів. Може виявитися, що для адекватного представлення процесу зміни станів семантика звичайного переходу для них недостатня. Тому в UML специфіковані додаткові позначення і властивості, якими можуть володіти окремі переходи на діаграмі станів.
Переходи між паралельними станами
В окремих випадках перехід може мати декілька станів-джерел і декілька цільових станів. Такий перехід називається – паралельний перехід. Розгляд паралельного переходу зумовлений необхідністю синхронізувати і/або розділити окремі підпроцеси на паралельні нитки без специфікації додаткової синхронізації в паралельних підавтоматах.
Графічно такий перехід зображається вертикальною рискою. Якщо паралельний перехід має дві або більше вхідних дуги (мал. 6.11, а), то його називають з'єднанням (join). Якщо ж він має дві або більш вихідних дуг (мал. 6.11, б), то його називають галуженням (fork). Текстовий рядок специфікації цього переходу записується поряд з рискою і стосується до всіх вхідних (вихідних) дуг.
Мал. 6.11. Зображення паралельного переходу з паралельних станів (а) і паралельного переходу в паралельні стани (б)
Спрацьовування паралельного переходу відбувається так. У першому випадку (перехід-з'єднання) перехід спрацьовує, якщо має місце подія-тригер для всіх вихідних станів цього переходу, і виконується (за наявності) сторожова умова. При спрацьовуванні переходу-з'єднання одночасно відбувається вихід зі всіх вихідних станів (стани 1 і 2) і перехід у цільовий стан. При цьому кожен з вихідних станів переходу повинен належати окремому підавтомату, що входить до складу автомата (процесу 1).
У другому випадку (галуження) відбувається розщеплювання автомата на два підавтомати, які створюють паралельні гілки вкладених підстанів. При цьому після спрацьовування переходу модельований об'єкт одночасно перебуватиме у всіх цільових станах цього переходу (стани 3 і 4).
Переходи між складеними станами
Перехід, стрілка якого сполучена з межею деякого складеного стану, позначає перехід в складений стан (перехід b на мал. 6.12). Він еквівалентний переходу в початковий стан кожного з підавтоматів (можливо, єдиного), які входять до складу даного суперстану. Перехід, який виходить із складеного стану (переходи f і g на мал. 6.12), відноситься до кожного з вкладених підстанів. Це означає, що об'єкт може покинути складений суперстан, перебуваючи в будь-якому з його підстанів. Для цього цілком досить виконання події і сторожової умови.
Мал. 6.12. Різні варіанти переходів в (з) складений стан
Інколи бажано реалізувати ситуацію, коли вихід з окремого вкладеного стану відповідав би виходу і із складеного стану теж. В цьому випадку малюють перехід, який безпосередньо виходить з вкладеного підстану за межі суперстану (перехід с на мал. 6.12). Аналогічно, допускається зображення переходів, які входять ззовні складеного стану в окремий вкладений стан (перехід а на мал. 6.12).
Синхронізуючі стани
Поведінка паралельних підавтоматів незалежить один від одного, що дозволяє реалізувати багатозадачність в програмних системах. Може виникнути необхідність врахувати в моделі синхронізацію настання окремих подій. Для цієї мети в мові UML є спеціальний псевдостан, який називається синхронізуючим станом.
Синхронізуючий стан (synch state) позначається невеликим колом, усередині якого поміщений символ зірочки "*". Він використовується разом з переходом-з'єднанням або переходом-галуженням для того, щоб явно вказати події в інших підавтоматах, які безпосередньо впливають на поведінку даного підавтомата.
Для ілюстрації використання синхронізуючих станів розглянемо спрощену ситуацію з моделюванням процесу спорудження будинку. Нехай спорудження будинку включає будівельні роботи (зведення фундаменту і стін, даху і штукатурка) і роботи по електрифікації будинку (підведення електричної лінії, прокладання електропроводки і установка світильників). Два ці комплекси робіт можуть виконуватися паралельно, проте між ними є деякий взаємозв'язок.
Зокрема, прокладка прихованої електропроводки може початися лише після того, як буде завершено зведення фундаменту і стін. А штукатурку слід почати лише після прокладання електропроводки. Інакше штукатурку доведеться проводити повторно. Особливості синхронізації цих паралельних процесів враховані на діаграмі станів за допомогою двох синхронізуючих станів (мал. 6.13).
Мал. 6.13. Діаграма станів для прикладу з будівництвом будинку
Розглянемо діаграму станів, яка є прикладом моделювання поведінки конкретного об'єкту, - процесу функціонування телефонного апарату (мал. 6.14).
Дана діаграма станів представляє єдиний автомат з одним складеним станом. Поза цим складеним станом є лише одне стан "очікування", яке характеризує справний і підключений до телефонної мережі телефонний апарат. Перехід в наступний стан відбувається при підніманні телефонної трубки. Перехід з атомарною дією "подати тоновий сигнал" переводить апарат в складений стан, а точніше – в початковий його підстан.
Мал. 6.14. Діаграма станів процесу функціонування телефонного апарату
Далі телефонний апарат перебуватиме в стані "тоновий сигнал". При цьому безперервно видаватиме цей сигнал до тих пір, поки не станеться подія-тригер "набір цифри (n)", або не пройде 15 секунд з моменту піднімання трубки. У першому випадку апарат перейде в стан "набір номера", а в другому - в стан "минув час очікування". Ця ситуація може бути результатом сумнівів з приводу "дзвонити - не дзвонити?". При наборі номера виконується подія-тригер "набір цифри (n) із сторожовою умовою "номер неповний". Це означає, що якщо набраний телефонний номер не містить необхідної кількості цифр, то нам слід продовжувати набір чергової цифри, залишаючись в стані "набір номера".
Якщо ж набраний номер повний, то можна перейти в стан "невірний номер" або "з'єднання". В разі невірного номера (сторожова умова "невірний" істинно) нічого не залишається, як вийти із складеного стану, поставивши слухавку. Якщо ж номер вірний, то відбувається з'єднання з цим номером.
Але у результаті з'єднання може трапитися, що апарат абонента зайнятий (перехід в стан "зайнято") або вільний (перехід в стан "дзвінок у абонента"). У першому випадку можна повторити дзвінок, заздалегідь поставивши слухавку (вихід із складеного стану). У другому випадку відбувається перевірка сторожової умови "розмова доступна". Якщо вона істинна, що відповідає зняттю трубки абонентом, починається телефонна розмова. Інакше (ця умова не виконується, тобто воно помилкове) телефон абонента продовжуватиме дзвонити, сповіщаючи нас про відсутність останнього або про неможливість з якої-небудь причини вести розмову по телефону.
Якщо ж розмова відбулася, то після слів прощання і виконання сторожової умови "підтвердження" на закінчення розмови ми ставимо слухавку. При цьому телефонний апарат переходить в стан "очікування", в якому може перебувати невизначено довго.
Примітка Розглянутий приклад відображає не всі аспекти поведінки навіть такого нескладного на перший погляд пристрою, яким є звичайний телефонний апарат. Дана діаграма станів може бути доповнена переходом з стану "очікування" по події-тригеру "телефонний дзвінок", яка може відразу перевести нас у внутрішній підстан "розмова", якщо ми вирішили зняти телефонну трубку (перехід типу а на мал. 6.12).
Інша модифікація може бути пов'язана з бажанням повторно використовувати набраний номер в разі коротких гудків "зайнято" у абонента. Рішення цієї задачі може бути реалізоване на основі використання історичного стану замість початкового підстану, який запам'ятовуватиме в пам'яті апарату останній набраний номер.