На этом шаге рассмотрим состояние объекта в UML.
Под состоянием объекта подразумевается совокупность всех его свойств и их текущих значений (включая также ссылки и связанные объекты). В число свойств входят атрибуты и ассоциации объекта, а также все его агрегированные части. Таким образом, состояние объекта динамично, и при его визуализации вы фактически описываете значение его состояния в данный момент времени и в данной точке пространства. Процесс изменения состояния объекта можно изобразить графически, если на одной и той же диаграмме взаимодействия нарисовать его несколько раз, причем на каждом рисунке будет отражено новое состояние.
Совершая над объектом операцию, вы изменяете его состояние, однако при запросе объекта его состояние не меняется. Предположим, бронируя билет на самолет (объект r : Заказ), вы определяете значение одного из атрибутов (например, цена билета = 11000.00). Изменив впоследствии условия заказа – скажем, добавив к маршруту еще одну пересадку, – вы тем самым изменяете и его состояние: например, цена билета становится равной 15000.00.
На рис. 1 показано, как изображать значение атрибутов объекта средствами языка UML.
Рис.1. Состояние объекта
Значение атрибута id объекта myCustomer равно "432891783". В данном случае тип идентификатора (SSN – номер социального страхования) показан явно, хотя его можно и опустить (как это сделано для атрибута active = True), поскольку тип содержится в объявлении id в ассоциированном классе объекта myCustomer.
С классом можно ассоциировать также автомат, что особенно полезно при моделировании управляемых событиями систем или жизненного цикла класса. В таких случаях можно показать состояние автомата для данного объекта в данный момент времени. Состояние изображается в квадратных скобках после типа. Например, на рис. 1 показано, что объект c – экземпляр класса Phone (Телефон) находится в состоянии WaitingForAnswer (ЖдетОтвета), определенном в автомате для класса Phone.
Так как объект может одновременно находиться в нескольких состояниях, вы можете вывести на диаграмме весь список его текущих состояний.
Поскольку процессы и потоки являются важными составными частями представления системы с точки зрения процессов, в UML имеется графический образ для различения активных и пассивных элементов (элемент считается активным, если он является частью процесса или потока и представляет собой исходную точку потока управления). Вы можете объявить активные классы, материализующие процесс или поток, и, соответственно, выделить экземпляр активного класса (см. рис. 2).
Рис.2. Активные объекты
Чаще всего активные объекты применяются в контексте диаграмм взаимодействия, моделирующих множественные потоки управления. Каждый активный объект представляет исходную точку потока управления и может использоваться для именования различных потоков.
В UML существуют еще два элемента, у которых могут быть экземпляры. Первый – это ассоциация. Экземпляром ассоциации является ссылка (link). Ссылка представляет собой семантическое соединение между объектами. Как и ассоциация, она изображается в виде линии; от ассоциации ее можно отличить по тому, что она соединяет только объекты.
Второй вариант – статический атрибут, область действия которого ограничена классом. Статический атрибут – это, по сути дела, объект в этом классе, совместно используемый всеми экземплярами класса. В объявлении класса такой атрибут подчеркивается.
Все механизмы расширения языка UML применяются к объектам. Тем не менее экземплярам обычно не приписывают стереотип непосредственно и не связывают с ними помеченных значений. Вместо этого стереотипы и помеченные значения объекта выводятся из ассоциированных с ним абстракций. В качестве примера на рис. 3 показано, как можно явно приписать стереотип самому объекту или его абстракции.
Рис.3. Объекты со стереотипами
В UML определены два стандартных стереотипа, применимых к связям зависимости между объектами и классами:
На следующем шаге рассмотрим типичные приемы моделирования конкретных экземпляров в UML.