Открытая коллекция знаний

OpenU.Ru

Справочник UML. Объектно-ориентированное проектирование.

action (действие)

Выполнимое атомарное вычисление, которое приводит к изменению состояния системы или возврату значения.
См. для сравнения activity.
См. entry action; exit action; transition.

Семантика

Действие - это атомарное или мгновенное вычисление. Другими словами, его нельзя прервать извне. Действие может быть привязано к переходу в конечном автомате (из одного состояния в другое или в рамках одного состояния) или к одному шагу во взаимодействии. Как правило, оно представляет собой примитивную или почти примитивную операцию над состоянием системы, часто даже не всей системы, а одного ее объекта. Среди типичных действий можно назвать присваивание значений атрибутам, осуществление доступа к значениям атрибутов или связей, создание новых объектов или связей, простые вычисления и отправка сигналов другим объектам. Действия - это те "кирпичики", из которых строится поведение системы. Действия считаются "быстрыми вычислениями", для реагирования на которые системе нужно ничтожно малое время. Система может совершать несколько действий одновременно, но выполнение каждого из них происходит независимо от других действий. Действия можно приписывать переходам (то есть они будут связаны с событиями перехода). Так, действия при входе и при выходе запускаются переходами, которые входят или покидают определенное состояние. Все действия атомарны, следовательно, всегда происходят без вмешательства других операций.
Деятельность (activity) также является вычислением, но у нее может быть своя внутренняя структура, поэтому она может быть прервана переходом по внешнему событию. Именно поэтому деятельность можно приписать состоянию, но не переходу. В отличие от действий деятельность может продолжаться безостановочно, пока ее не прервут извне (иногда деятельность прекращается сама по себе). Действие же невозможно прервать извне, поэтому его можно приписать переходу, входу в состояние или выходу из него, но не самому состоянию.

Структура

Каждое действие имеет множество целевых объектов, ссылку на сигнал, который нужно отправить, или операцию, которую нужно выполнить (и то и другое можно обозначить общим термином запрос), перечень значений аргументов и необязательное рекуррентное выражение, определяющее возможную итерацию.
Множество целевых объектов. Выражение, описывающее множество объектов. В большинстве случаев "множество" состоит из одного объекта. Копии сообщения с заданным перечнем аргументов отсылаются одновременно всем целевым объектам действия, (это называется "вещанием"). Каждый целевой объект независимо получает и обрабатывает свой экземпляр сообщения. Если целевых объектов нет, то ничего не происходит.
Запрос. Описывает сигнал или объявление операции (объектам отправляется сигнал, либо происходит вызов операции). Если операция возвращает значение, для нее должен быть указан единственный целевой объект.
Список аргументов. Значения аргументов в процессе вычисления должны соответствовать параметрам сигнала или операции. Аргументы являются частью вызова операции или отправки сигнала.
Рекуррентность. Итеративное выражение, определяющее, сколько раз нужно выполнять данное действие. Может также определять переменные для итерации. Кроме этого, таким выражением можно описывать условное действие (итерацию с нулевой или единичной повторяемостью).

Виды действий

Присваивание. Действие, которое устанавливает определенное значение атрибута объекта. Состоит из выражения, описывающего целевой объект, названия атрибута этого объекта, а также значение, которое должно быть присвоено атрибуту.
Вызов. Действие вызова всегда описывает выполнение над объектом какой-либо операции. Собственно, под словом "вызов" имеется в виду вызов операции. Действие вызова состоит из имени сообщения, списка выражений аргументов и выражения для целевых объектов. При существовании нескольких целевых объектов действия вызова происходят одновременно, а вызываемая операция не может возвращать значение. (Для того чтобы операция могла возвращать значение, у нее должен быть только один целевой объект.) Действие вызова синхронно, то есть объект, отправивший вызов, должен дождаться завершения вызванной операции, прежде чем снова получит управление. Если операция реализована как событие вызова, то объект, отправивший вызов, должен дождаться перехода в объекте-получателе, прежде чем снова получит управление. Если операция возвращает значения, то объект, отправивший вызов, получит их вместе с управлением.
Создание. Результатом этого действия является создание и инициализация экземпляра объекта. Действие создания ссылается на класс и в некоторых случаях на операцию в рамках класса. Также указывается список аргументов. Выполнение этого действия приводит к созданию нового экземпляра класса.
Уничтожение. Результатом этого действия является уничтожение целевого объекта. В выражении действия "уничтожить" указывается объект, который должен быть уничтожен, никаких других аргументов у этого действия нет. В результате выполнения действия уничтожается не только сам объект, но и все его связи, и композитные части, которые в него входят.
См. composition.
Возврат. Обеспечивает передачу управления вызывающему объекту. Это действие допустимо только внутри вызванной операции. У него может быть список возвращаемых значений, которые становятся доступными вызывающему объекту при получении управления. Если же операция была вызвана асинхронно, то вызывающий объект должен, явно получать возвращаемое сообщение в виде сигнала. В противном случае это сообщение будет потеряно.
Отправка. В результате этого действия создастся экземпляр сигнала, для которого задаются начальные установки в виде аргументов, полученных при вычислении выражении аргументов этого действия. Затем сигнал отправляется объектам, заданным с помощью целевого выражении действия. Каждый из этих объектов получает свою копию сигнала. Так как действие отправки сигнала асинхронно, после него объект сохраняет собственный поток управления и продолжает работу в системе. Действие состоит из имени сигнала, списка выражений аргументов сигнала, а также выражения для определения нелепых объектов.
Если множество нулевых объектов не указано, сигнал отправляется одному или нескольким объектам, определяемым самим сигналом и конфигурацией системы. Например, исключение распространяется в пределах, определяемых системной политикой.
Прекращение. Это действие приводит к уничтожению того объекта, которому принадлежит конечный автомат, содержащий в себе действие прекращения. Чем-то это напоминает самоубийство.
Уничтожение объекта является событием, на которое могут реагировать другие объекты.
Не интерпретированное действие. Конструкции, относящаяся к управлению или чему-либо еще, не описываемому языком UML.

Нотация

В UML нет установленного языка для обозначения действий. Нам кажется, что многие разработчики будут использовать для этого какой-либо язык программирования. В этой книге мы пишем псевдокод действий с помощью адаптированного языка ОСL, но это ни в коей мере не является стандартом.
Действие присваивания
цель:= выражение
Действие вызова
множество объектов. имя операции (аргументсписок)
Действие создания
new имя класса (аргументсписок)
Действие уничтожения
объект.destroy ()
Действие возврата
return выражениесписок
Действие отправки
множествообъектов.имя сигнала (аргументсписок)
Действие прекращения
terminate
Не интерпретируемое действие
If(выражение) then (действие) else (действие)
В случае, когда вам необходимо явно различать действия вызова и отправки, ставьте перед выражением ключевое слово call или send. Впрочем, это решает разработчик.

Обсуждение

Язык UML определяет только небольшой набор действий, остальные же, как мы ожидаем, будут добавлены разработчиками в процессе непосредственной реализации системы в программном коде.
Это решение явилось компромиссом между нашим желанием сделать UML как можно более точным и не ограничивать при этом число возможных языков реализаций, каждый из которых обладает множеством семантических концепций. Следует отметить, что в семантике языков программирования, касающейся выполнения кода, существует гораздо больше вариантов, нежели в их структурах данных или конструкциях управления, очень сложно отразить тонкие различия между языками на практике, даже если теоретически это вполне возможно. Выбрать один язык программирования и построить на его основе язык для обозначения действий - значить пренебречь остальными языками и мнением тех разработчиков, которые на них программируют. Этого мы не могли допустить. Именно поэтому семантическая сторона действий осталась в языке UML несколько недоработанной. Чтобы восполнить этот пробел, разработчик должен прибегнуть к помощи выбранного им самим языка программирования. Конечно, это вызывает некоторые нарекания, но мы считаем, что навязывать некий общий язык для описания действий - значило бы принести еще больше неудобств.

Алфавитный указатель