М. Фаулер, К. Скотт - UML. Основы - 2002 (1158629), страница 27
Текст из файла (страница 27)
Из начальной точки процесс переходит в состояние Проверка. Этот переход имеет метку «/получить первую позицию заказаэ. Синтаксис метки перехода состоит из трех частей, каждая из которых является необязательной: Событие 1Сторожееое условие1 /Действие. В данном случае метка состоит только из действия вполучить первую позицию заказа». После выполнения этого действия мы попадаем в состояние Проверка. С этим состоянием ассоциируется некоторая деятельность, которая обозначается меткой со следующим синтаксисом: 128 Глава 8. Диаграммы состояний вьтолнить/деятельность.
В данном случае деятельность называется «проверить позицию заказа». [Не зсе яозици /псяЗчить Повиси [ивкОтор отсЪтств Рис. В.1. Диаграмма состояний Следует отметить, что я пользуюсь терминами «действие» [асФ[оп) для перехода и «деятельность» (асФ[тг[1у) для состояния. Хотя оба термина обозначают процессы, обычно реализуемые некоторым методом класса Заказ, они трактуются различным образом.
Действия ассоциируются с переходами и рассматриваются как мгновенные и непрерываемые. Деятельности ассоциируются с состояниями и могут продолжаться достаточно долго. Деятельность может быть прервана некоторым событием. Обратите внимание, что смысл определения «мгновенный» зависит от типа разрабатываемой системы. Для компьютерных систем реального времени зто может соответствовать нескольким машинным командам; для обычной информационной системы «мгновение» может означать менее нескольких секунд.
Если метка перехода не содержит никакого события, зто означает, что переход произойдет, как только завершится какая-либо деятельность, ассоциированная с данным состоянием; в данном случае — как только будет выполнена Проверка. Из состояния Проверка выходят три перехода. Метка каждого из них включает только Сторожевое условие. Сторожевое условие — зто логическое условие, которое может принимать одно из двух значений: «истина» или «ложь». Переход со сторо- Диаграммы состояний жевым условием выполняется только в том случае, если данное сторо- жевое условие принимает значение «истина».
Из конкретного состояния в данный момент времени может быть осуществлен только один переход, таким образом, сторожевые условия должны быть взаимно исключающими для любого события. На рис. 8. 1 мы имеем дело с тремя условиями: 1. Если проверены не все позиции, входящие в заказ, мы получаем следующую позицию и возвращаемся в состояние Проверка. 2. Если проверены все позиции и все они имеются на складе, то мы переходим в состояние Отправка. 3. Если проверены все позиции, но не все из них имеются на складе, то мы переходим в состояние Ожидание. Сначала рассмотрим состояние Ожидание. В этом состоянии не существует деятельностей, поэтому данный заказ находится в состоянии ожидания, пока не наступит некоторое событие.
Оба перехода из состояния Ожидание помечены событием «Позиция получена». Это означает, что соответствующий заказ находится в состоянии Ожидание до тех пор, пока он не обнаружит наступление данного события. В этот момент оцениваются сторожевые условия данных переходов, и выполняется соответствующий переход либо в состояние Отправка, либо обратно в состояние Ожидание. В состоянии Отправка имеется деятельность, которая инициирует доставку. Из этого состояния имеется единственный безусловный переход, который происходит в результате наступления события «Отправлен». Это означает, что рассматриваемый переход обязательно произойдет, если наступит данное событие.
При этом следует заметить, что этот переход не произойдет, даже если завершится деятельность; наоборот, когда деятельность «инициировать доставку» завершится, данный заказ останется в состоянии Отправка, пока не наступит событие «Отправлен». Наконец, рассмотрим переход с именем «отмена». Мы должны располагать возможностью отменить заказ в любой момент, пока заказ не доставлен клиенту. Это можно сделать, изобразив отдельные переходы из каждого состояния: Проверка, Ожидание и Отправка.
Удобный альтернативный вариант — определить некоторое суиерсостояиие для трех перечисленных состояний, после чего нарисовать единственный выходящий из него переход. В этом случае подсостояния просто наследуют любые переходы суперсостояния. Оба подхода изображены на рис. 8. 2 и 8.3.
Они описывают одно и то же поведение системы. Глава 8. Диаграммы состояний ~Не все поз /получить сл Повии ~накот Отсутст Рис. 8.2.Диаграмма состояний бег суперсостояний Рис. 8.2 выглядит довольно перегруженным, хотя на нем изображено всего три дублирующих перехода. На рис. 8.3 картина в целом выглядит гораздо яснее, и если впоследствии потребуется внести какие-либо изменения, то будет значительно труднее упустить из вида событие «отмена». В данных примерах я изобразил деятельность внутри состояния в виде текста «выполнить/деятельность».
Внутри состояния также можно указать и другую информацию. Если состояние реагирует на событие, связанное с действием, которое не влечет за собой никакой переход, этот факт можно изобразить, поместив текст вида «ИмяСобытия / ИмяДействия» в прямоугольник состояния. Помимо событий с именами существуют еще два других типа событий: ° Событие может быть инициировано после завершения определенного периода времени. Такое событие можно пометить ключевым словом после.
Например, можно записать после /20 минут ). Диаграммы состояний Имл суперсхтолнлл Активное [Не есе позиции проверены] /получить следующую позицию Проверка [Все позиции проверены М есе позиции досттпны] От~ранка выполнить проверку/ проверить позицию выполнить отправку/ инициировать доставку [Все позиции проверены $$ некоторые позиции отсутствуют на складе] Позиция получена [некоторые позиции отсутствуют нз складе] Ожидание отмена Отмена Заказа Достамта Рис.
8.3. Диаграмма состояний с с уперсост оян ия ми. ° Событие может быть инициировано в результате выполнения того или иного логического условия. Такое событие можно пометить ключевым словом если. Например, можно записать если /температура >100 градусов). Существуют также два особых события: вход и выход. Любое действие, связанное с событием входа, выполняется в момент перехода объекта в данное состояние. Действие, ассоциированное с событием выхода, выполняется в том случае, когда объект покидает данное состояние в результате осуществления некоторого перехода. Ясли имеется так называемый рефлексивный переход, возвращающий объект обратно в то же самое состояние и связанный с каким-либо действием, то сначала должно выполниться действие выхода, затем действие данного перехода и, наконец, действие входа.
Если с данным состоянием ассоциирована некоторая деятельность, то она начнет выполняться сразу после действия входа. Глава 8. Диаграммы состояний Диаграммы параллельных состояний Помимо состояний заказа, связанных с наличием позиций заказа, существуют также состояния, связанные с подтверждением оплаты заказа. Эти состояния могут быть представлены диаграммой состояний, подобной той, которая изображена на рис. 8.4. [опяаза Рис.8.4. Подтверждение оплаты заказа В данном случае все начинается с проверки подтверждения оплаты, Деятельность «проверить оплату» завершается сообщением о результате выполнения данной проверки.
Коли оплата заказа выполнена, то данный заказ ожидает в состоянии Оплата Подтверждена до тех пор, пока не наступит событие «отправлен». В противном случае заказ переходит в состояние Отвергнут. Таким образом, поведение объекта Заказ определяется как комбинация поведений, изображенных на рис. 8.1 и 8.4, Все зти состояния и рассмотренное ранее состояние Отмена можно объединить в одну диаграмму параллельных состояний (рис. 8. б). Обратите внимание, что на рис. 8.5 детали внутренних состояний нв изображены.
Диаграммы параллельных состояний Рис. В.Б.Диаграмма лараллел»ныл состояний Смысл параллельных секций диаграммы состояний заключается в том, что в любой момент времени данный заказ находится одновременно в двух различных состояниях, каждое из которых относится к своей исходной диаграмме. Когда заказ покидает параллельные состояния, он оказывается только в одном состоянии. Из этой диаграммы можно увидеть, что в начальный момент заказ оказывается одновременно в двух состояниях: Проверка Позиции Заказа и Подтверждение Оплаты.
Если деятельность »проверить оплату» в состоянии Подтверждение Оплаты успешно завершится первой, то заказ окажется в двух состояниях: Проверка Позиции Заказа и Оплата Подтверждена. Если же наступит событие «отменен», то заказ окажется только в состоянии Отмена. Диаграммы параллельных состояний полезны в тех ситуациях, когда некоторый объект обладает множеством независимых поведений. Отметим, однако, что не следует создавать слишком большое количество параллельных состояний, описывающих поведение одного объекта. Если для некоторого объекта имеется несколько достаточно сложных диаграмм параллельных состояний, то следует рассмотреть возможность разделения этого объекта на отдельные объекты.
134 Глава 8. Диаграммы состояний Когда использовать диаграммы состояний Диаграммы состояний являются хорошим средством для описания поведения некоторого объекта в нескольких различных вариантах использования. Однако они не слишком пригодны для описания поведения нескольких объектов, образующих кооперацию. По существу, диаграммы состояний полезно объединять с другими методами.
Например, диаграммы взаимодействия (см. главу 5) являются хорошим средством для описания поведения нескольких объектов в одном варианте использования, а диаграммы деятельности (см. главу 9) удобны для представления общей последовательности действий для нескольких объектов и вариантов использования. Не все разработчики считают диаграммы состояний естественными. Следует внимательно присмотреться к тому, как аналитики работают с этими диаграммами. Может оказаться, что ваша команда считает диаграммы состояний бесполезными, потому что они не вписываются в ее стиль работы. Это не столь большая проблема; как всегда, нужно помнить, что следует пользоваться именно теми средствами, которые больше подходят для вашей работы. Если вы все-таки пользуетесь диаграммами состояний, не пытайтесь строить их для каждого класса в вашей системе. Хотя строгие формалисты зачастую применяют именно такой подход, это почти всегда будет пустой тратой времени.