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

OpenU.Ru

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

collaboration (кооперация)

Описание общего расположения объектов и связей, которые взаимодействуют для обеспечения некоторого поведения, такого как вариант использования или операция. Имеет статическую и динамическую части. В статической описываются те роли, которые объекты и связи могут играть в экземпляре данной кооперации. Динамическая же состоит из одного или более взаимодействий, демонстрирующих потоки сообщений, которыми обмениваются участники кооперации.
См. association role; classifier role; interaction; message.

Семантика

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

Структура

Роли. Кооперация состоит из некоторого множества ролей, каждая из которых представляет собой ссылку на один или несколько базовых классификаторов (ролей классификаторов) или базовых ассоциаций (ролей в ассоциациях).
Роль - это слот, в котором описывается использование классификатора или ассоциации в данной кооперации. Более того, роль сама по себе тоже является классификатором. Объект, который связан с данной ролью в этом экземпляре кооперации, представляет собой временный экземпляр этого классификатора. В экземпляре кооперации с каждой ролью классификатора связывается объект, а с ролью в ассоциации - связь. Один и тот же объект может быть связан с несколькими ролями классификаторов одного экземпляра кооперации. Впрочем, это не принято и может быть запрещено с помощью соответствующего ограничения. Объекты одного и того же класса могут играть различные роли, в одном и том же экземпляре кооперации. Каждый объект при этом будет иметь отношения, соответствующие его роли. У каждой роли классификатора есть некоторое подмножество черт, которые используются в данной кооперации. Все прочие черты в этой кооперации не используются, а, следовательно, излишни, хотя могут быть необходимы в других кооперациях. Если в кооперации существует несколько ролей, за действующих один и тот же базовый классификатор, то во избежание путаницы им следует дать имена. Если базовому классификатору соответствует только одна роль, то ее можно оставить без имени. Именно роли определяют структуру кооперации.
Если в модели поддерживается множественная классификация, то одной роли может соответствовать несколько базовых классификаторов. В таком случае объект, связанный с ролью классификатора, будет являться экземпляром каждого из них.
Обобщения. Кооперация может также включать в себя обобщения и ограничения, которые добавляются к тем отношениям, которыми обладают вне данной кооперации участвующие в ней классификаторы. Обобщение в кооперации необходимо лишь в том случае, когда классификаторы представляют собой параметры. В противном случае структура обобщения классификатором описывается при их определении и в кооперации может оставаться неизменной. В параметризованной кооперации (то есть образце) некоторые роли классификатора могут быть представлены параметрами. Обобщение, существующее между двумя параметризованными ролями, указывает на то, что любые классификаторы, связанные с этими ролями, должны удовлетворять этому отношению обобщения. (Классификатор, связанный с ролью-прямым предком, должен быть предком классификатора, связанного с ролью-прямым потомком. При этом им не обязательно нужно быть прямым предком и прямым потомком, но отношению друг к другу.)
Например, образец Composit (Компоновщик) из книги Гаммы представляет собой рекурсивное дерево объектов, в котором класс Component (Компонент) является обычным элементом дерева, Composite (Компоновщик) - рекурсивным элементом, a Leaf (Лист) - элементом-листом (рис. 50). Класс Component является прямым предком для классов Leaf и Composite, причем последний является агрегатом элементов класса Component (задается рекурсия). Классы Component, Composite и Leaf в данном образце представляют собой параметры. При использовании образца их замещают действительные классы. В любом множестве действительных классов, связанных с таким образцом, должны соблюдаться отношения предок-потомок, существующие между классом Component и его прямыми потомками - классами Composite и Leaf. Среди возможных кандидатов на подстановку будут классы Graphic (Графический элемент), Picture (Рисунок), Rectangle (Прямоугольник), DirectoryEntry (Запись в каталоге), Directory (Каталог) и File (Файл), а также любые другие рекурсивные классы. Если при связывании нарушаются ограничения обобщения, модель считается плохо согласованной.

Рис. 50. Образец: параметризованная кооперация
Ограничения. Ограничения могут применяться как к параметризованным, так и к не параметризованным ролям. Ограничения кооперации добавляются к тем, которые, возможно, уже существуют у классификаторов, связанных с ролями. Ограничения применяются к каждому экземпляру кооперации.
Сообщения. Кооперация может иметь множество сообщений для описания ее динамического поведения. Кооперация, у которой есть сообщения, представляет собой взаимодействие. При этом взаимодействий может быть несколько - каждое из них будет описывать часть одной общей кооперации. Одно взаимодействие может описывать реализацию одной операции, а другое взаимодействие - реализацию другой операции. Сообщения передают упорядоченную информацию. Упорядочивание передачи информации путем сообщений эквивалентно определению конечного автомата, у которого переходы запускаются с помощью сообщений.

Нотация

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

имя роли: имя класса

Имя роли или имя класса можно опустить, однако двоеточие должно остаться.
Связи между объектами изображаются на диаграмме в виде ролей в ассоциации, включая временные связи: аргументы процедур, локальные переменные и самосвязи. Несколько ролей в ассоциации могут иметь одно и то же имя ассоциации, если, разумеется, они соединяют различные роли классификатора. Стрелки на линиях указывают направление навигации, которое соответствует направлению, указанному стрелкой. (Наконечник стрелки, расположенный на линии между объектами-прямоугольниками, обозначает одностороннюю навигацию. Стрелка рядом с линией указывает на направление потока сообщений по этой связи. Поток сообщений не может двигаться по односторонней связи в обратную сторону, поэтому направление потоков сообщений должно совпадать с направлением навигационных стрелок.)
Отдельные значения атрибутов в ролях классификатора, как правило, изображаются неявно. Если сообщения должны отправляться значениям атрибута, то атрибуты нужно моделировать с использованием ассоциаций в виде отдельных объектов.
Инструменты моделирования могут предлагать другие способы графической маркировки в дополнение к ключевым словам или помимо них. Например, роли с разным временем жизни могут помечаться каким-либо особым цветом. Кроме этого, инструменты моделирования могут располагать анимационными возможностями для демонстрации создания или уничтожения элементов, а также для изображения состоянии системы в различные периоды времени,
Реализация операции
Кооперация, которая изображает реализацию операции в программном коде, включает в себя символы роли целевого объекта и ролей других объектов, которые целевой объект явно или неявно использует для совершения данной операции. Сообщения у ролей в ассоциации указывают на поток управления во взаимодействии. Каждое сообщение изображает один шаг в программной реализации операции (методе).
Кооперация, которая описывает операцию, также включает в себя символы ролей, представляющие собой аргументы операции, а также локальные переменные, создаваемые во время выполнения операции. Объекты, создаваемые во время выполнения операции, могут быть помечены как {new} (новый); объекты, которые во время выполнения операции уничтожаются, - как {destroyed} (уничтожаемый). Те же объекты, которые создаются и уничтожаются во время выполнения операции, можно пометить как {transient} (временные). Объекты, не помеченные никаким ключевым словом, существуют на момент начала выполнения операции и продолжают свое существование после его окончания.
Внутренние сообщения, которые реализуют метод, нумеруются, начиная с единицы. В случае процедурного потока управления для вторичных сообщений используется "точечная" поднумерация, соответствующая вложенности вызова. Например, второй шаг решето уровня - это шаг 2; первый вторичный шаг внутри пего - сообщение 2.1 и т.д. Порядковые номера асинхронных сообщений, которыми обмениваются параллельно существующие объекты, должны быть одноуровневыми (то есть не вложенными).
См. полное описание синтаксиса сообщения в словарной статье message.
На законченной диаграмме кооперации изображаются роли всех объектов и связей, использующихся в данной операции. Если какой-то объект не нашел отображения на диаграмме, значит, он там не используется. Впрочем, не стоит заранее предполагать, что все объекты на диаграмме кооперации действительно используются.

Пример


На рис. 51 объект Controller (Контроллер) вызывает операцию redisplay (показать повторно). Во время вызова у него уже существует связь с объектом Window (Окно), в котором будет отображаться требуемый рисунок. Кроме того, у него есть связь с объектом Wire (Провод), изображение которого будет показано в окне.
Рис. 51. Диаграмма кооперации с потоками сообщений
На высшем уровне реализация операции redisplay содержит всего один шаг - вызов операции displayPositions (показатьПозипии), относящейся к объекту Wire. Эта операция имеет порядковый номер 1, так как представляет собой первый шаг в методе. Этому сообщению передается ссылка на объект Window, который, как будет показано ниже, нужен для выполнения этой операции.
Операция displayPositions вызывает операцию drawSegment (нарисоватьСегмент), также относящуюся к объекту Wire. Вызов, помеченный номером 1.1, отправлен по неявной само-связи. Звездочка указывает на повторный вызов операции. Подробности описаны в круглых скобках.
Каждая операция drawSegment осуществляет доступ к двум объектам Bead (Цепочка), один из которых помечен значением квалификатора i-1, а другой - просто 1. В контексте данной операции к двум объектам Wire должны вести две связи (несмотря на то, что между объектами Wire и Bead существует только одна ассоциация). Объекты помечены словами left (левый) и right (правый) - это их роли в данной кооперации. По каждой из двух связей передается одно сообщение. Сообщения помечены номерами 1.1.1а и 1.1.lb. Это указывает на то, что оба являются шагами операции 1.1, а буквы обозначают, что оба сообщения могут быть отправлены параллельно. При обычной реализации в программном коде они едва ли будут выполняться параллельно, но поскольку они уже объявлены параллельными, то могут выполняться в любой удобной последовательности.
После возврата обоих значений (г0 и r1) может осуществляться следующий шаг операции 1.1. Сообщение 1.1.2 представляет собой сообщение "создать", которое отправляется объекту Line (Линия). На самом деле оно идет к классу Line (по крайней мере), который создаст новый объект Line, связанный с отправителем сообщения. Новый объект будет помечен словом {new}, указывающим на то, что он был создан во время выполнения операции и будет существовать и после ее окончания. Новая связь будет помечена как "local" (локальная). Это означает, что она является не ассоциацией, а локальной переменной в данной процедуре. Локальные переменные временны по определению и по окончании работы процедуры исчезают. Поэтому не нужно явно помечать их как временные с помощью ключевого слова {transient}.
Новая связь используется в шаге 1.1.3 для отправки сообщения display (показать) вновь созданному объекту Line. Указатель на объект Window передается в виде аргумента, что делает этот объект доступным для Line через связь "parameter". Обратите внимание, что у объекта Line есть связь с тем объектом Window, который ассоциирован с исходным объектом Controller. Для операции это важно, поэтому это изображается на диаграмме. Во время последнего шага под номером 1.1.3.1 объект Window создает связь с объектом Line. Эта связь является ассоциацией, поэтому для нее задается имя роли contents (содержимое), помеченное словом {new}.
Понять конечное состояние системы можно, если мысленно "стереть" все временные связи - связь, идущую от объекта Controller к объекту Wire; от Wire к его двум частям - объектам Bead; от объекта Controller к объекту Window и от объекта Window к его cpntents (содержимому). После завершения операции у объекта Line не будет доступа к объекту Window, который его содержит. Связь в этом направлении временна - то есть исчезает после окончания операции. Точно так же у объекта Wire не будет более доступа к объектам Line, которые использовались для его изображения.

Кооперации на уровне экземпляров

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

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