Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ГОСЫ / ГОСБилеты.odt
Скачиваний:
139
Добавлен:
05.06.2015
Размер:
1.54 Mб
Скачать

Билет 24.

1. Динамическое поведение объектов. Состояния, события, сигналы и сообщения. Модели взаимодействия объектов.

Рассмотрим существующие типы сообщений и приемы их визуального представления с помощью диаграмм последовательности. При одностороннем вызове управление возвращается объекту, инициировавшему вызов, сразу после принятия вызова объектом-получателем (рис. 1.24 а). Объект-отправитель продолжает функционировать одновременно с выполнением запрашиваемой операции. Синхронизация между объектами отсутствует.

Односторонние вызовы используются объектом-отправителем, когда не требуется ожидать завершения выполнения операции. Операция не возвращает результат своей работы. Следовательно, подразумевается, что такая операция не может нарушить целостность работы объекта-получателя.

При выполнении синхронных вызовов (рис. 1.24 б) объект-отправитель блокируется на все время выполнения операции объектом-получателем. Результат работы операции или сообщение о возникших ошибках возвращаются объекту-отправителю. Только после этого объект сможет продолжить свою дальнейшую работу. Типичный пример синхронного вызова – выполнение методов объекта. Способы ослабления синхронности показаны на рис. 1.24 (в, г).

Отсроченные синхронные вызовы объединяют свойства двух выше рассмотренных. Как и односторонние, они сразу же возвращают управление, но могут использоваться в тех случаях, когда необходимо получить результат выполнения операции. Для этой цели существует специальный объект-посредник, который создается в момент завершения операции и которому передается служебная информация объектом-получателем.

В результате объект-отправитель получает информацию об операции от объект-посредника. Недостатком такого способа является необходимость периодической проверки (опроса), что, конечно, повышает его ресурсоемкость. Типичный прием применения техники отсроченного синхронного вызова заключается в использовании флага (некоторой булевой переменной), находящегося в области видимости обоих объектов. После выполнения операции статус флага изменяется, а объект-отправитель периодически его проверяет, отслеживая изменение.

Асинхронные вызовы не ожидают окончания работы объекта-получателя, а выполняются в отдельном потоке управления. Передача асинхронных сообщений предполагает существование множественных потоков управления и в основном характерна для инженерных приложений и приложений реального времени.

Обратные вызовы позволяют проинформировать объект-отправитель о завершении обработки сообщения путем передачи ему асинхронного сообщения (рис. 1.24 г.). Перед выполнением вызова объекту-получателю сообщается адрес некоторой функции обратного вызова (callback function) объекта-отправителя. По завершении обработки сообщения выполняется обратный вызов.

Автосообщения предназначены для передачи объектом сообщений самому себе. В этом случае происходит локальный вызов – один метод вызывает другой метод одного и того же объекта. Само название автосообщение заимствовано из языка SmallTalk. Применительно к объекту в языках C++ и Java автосообщению соответствует термин this, а в языке Object Pascal – self. Соответствующий объект представляет собой константу, которая хранит идентификатор объекта OID. При необходимости автообъект может быть передан как аргумент в сообщении.

а). Односторонний вызов.

б). Синхронный вызов.

в). Отсроченный синхронный вызов.

г). Обратный вызов.

Рис. 1.24. Способы синхронизации объектов.

В UML сообщения имеют специальное обозначение (рис. 1.25). Направление стрелки указывает на получателя сообщения. Стрелка на рис. 1.25 а обозначает простой вызов процедуры. Обычно такие сообщения являются синхронными. Стрелка на рис. 1.25 б обозначает простой поток управления. Каждая такая стрелка изображает один этап в последовательности потока управления. Стрелка на рис. 1.25 в используется для обозначения асинхронного потока управления. Соответствующие сообщения формируются в произвольные, заранее не известные моменты времени, как правило, активными объектами. Стрелка на рис. 1.25 г обозначает возврат из вызова процедуры.

В UML предусмотрены стандартные действия (стереотипы), выполняемые в ответ на получение соответствующего сообщения. Они могут быть явно указаны на диаграмме рядом с сообщением, к которому они относятся. В этом случае они записываются в кавычках.

Используются следующие обозначения для моделирования действий:

  1. "call" (вызвать) – сообщение, требующее вызова операции или процедуры принимающего объекта. Если сообщение с таким стереотипом рефлексивное, то оно инициирует локальный вызов операции у пославшего это сообщение объекта;

  2. "return" (возвратить) – сообщение, возвращающее значение выполненной операции вызвавшему ее объекту;

  3. "create" (создать) – сообщение, требующее создания другого объекта для выполнения определенных действий. Созданный объект может получить фокус управления;

  4. "destroy" (уничтожить) – сообщение с требованием уничтожить соответствующий объект. Посылается в том случае, когда объект больше не нужен и должен освободить задействованные им системные ресурсы;

  5. "send" (послать) – обозначает посылку другому объекту некоторого сообщения, который асинхронно (без временной синхронизации) инициируется одним объектом и принимается (перехватывается) другим.

Наряду с сообщениями в UML определены понятия события и сигнала. Событием является сообщение, при получении которого объектом происходит изменение его внутреннего состояния. Сигнал является событием особого рода, при котором событие передается асинхронно от одного объекта к другому. Если говорить точнее, сигнал – именованный объект, асинхронно возбуждаемый одним объектом и принимаемый другим. Примером могут служить объекты исключений, которые поддерживаются в ряде объектно-ориентированных языках программирования для обработки ошибок.

Активные и пассивные классы

Взаимодействия между объектами описываются сообщениями, которыми они обмениваются. Сообщения передают некоторую информацию от одного объекта другому. При этом первый объект ожидает, что после получения сообщения вторым объектом последует выполнение некоторого действия. Таким образом, сообщения являются причиной создания, уничтожения объектов и выполнения ими определенных операций.

Когда объект посылает сообщение другому объекту, объект-получатель может инициировать передачу нового сообщения следующему объекту и т.д. Такой поток сообщений формирует последовательность, которая всегда имеет начало в некотором потоке. Каждый поток в системе определяет отдельный поток управления. В каждом потоке управления сообщения упорядочены по времени.

Потоки не существуют сами по себе. Они порождаются процессами. Процесс (Process) – ресурсоемкий поток управления, который выполняется параллельно с другими процессами. Можно сказать, что поток (Thread) – это облегченный поток управления, т.е. требующий меньше системных ресурсов, и выполняемый одновременно с другими потоками в рамках одного процесса.

В UML каждый независимый поток управления моделируется как активный объект. Активный объект описывает поток и способен инициировать некоторое управляющее воздействие. Активный класс – это класс, экземплярами которого являются активные объекты. Для явного различения, обычные классы иначе называют пассивными, указывая тем самым, что класс не способен инициировать независимое управляющее воздействие.

Активный класс используется для представления потока, в контексте которого выполняется независимый поток управления, работающий параллельно с другими равноправными потоками в рамках данного процесса. Когда создается активный объект, запускается на выполнение ассоциированный с ним поток управления. Когда активный объект уничтожается, работка потока завершается.

Процесс известен операционной системе и располагается в отдельном адресном пространстве. Все потоки всегда выполняются в контексте некоторого процесса. Кроме того, процессы и потоки никогда не бывают вложенными. Современные операционные системы обеспечивают возможность существования множества процессов и одновременного (параллельного) исполнения множества потоков в контексте каждого процесса.

Активным классам присущи свойства обычных классов: они имеют атрибуты, методы, участвуют в отношениях зависимости, обобщения, ассоциации.

Активные и пассивные объекты могут взаимодействовать друг с другом посредством обмена сообщениями. Рассмотрим возможные комбинации такого взаимодействия. Первый случай – пассивный объект передает сообщение другому такому же. Если оба объекта существуют в одном потоке, такое сообщение есть обычный вызов метода другого объекта.

Второй случай – активный объект передает сообщение другому активному. Здесь имеет место межпотоковое взаимодействие, т.к. каждому активному объекту соответствует свой собственный поток. Заметим, что здесь мы не оговариваем, принадлежат ли потоки одному процессу или разным процессам. В любом случае возможны два варианта взаимодействия.

В первом случае объект, вызывающий операцию другого объекта ждет ее окончания для получения результата. На все время выполнения операции оба потока будут заблокированы, а после ее выполнения будут вновь работать независимо друг от друга. Такой вариант называется синхронным вызовом.

Во втором случае вызов выполняется асинхронно: объект запрашивает операцию, и, не дожидаясь окончания ее выполнения, продолжает работу. Если принимающая сторона не сможет сразу получить сообщение, сообщение ставится в очередь, из которой в дальнейшем оно будет извлечено. Таким образом, объекты не синхронизированы, получают и обрабатывают сообщения по мере их поступления.

Третий случай – передача сообщения от активного объекта пассивному. Здесь чрезвычайно важна синхронизация активных объектов между собой, т.к. они не могут одновременно передать сообщение пассивному объекту. Для решения этой задачи существуют специальные способы синхронизации.

Наконец, последний вариант взаимодействия – передача сообщения от пассивного объекта активному. Учитывая, что каждый поток управления принадлежит некоторому активному объекту, взаимодействие в этом случае сводится к взаимодействию между двумя активными объектами

Соседние файлы в папке ГОСЫ