Собственно объекты не представляют никакой интерес: лишь в процессе взаимодействия объектов реализуется система. За выражением Ингалса: "Вместо процессора, который бесстыже перемалывает структуры данных, мы получаем содружество хорошо воспитанных объектов, которые учтиво просят друг друга об услугах". Самолет, по определению, "совокупность элементов, каждый из которых по своей природе стремится упасть на землю, но за счет совместных непрерывных усилий преодолевающих эту тенденцию". Он летит лишь благодаря согласованным усилиям своих компонентов.
Отношения двух любых объектов основываются на предположениях, которыми один владеет относительно другого: об операциях, что можно выполнять, и об ожидаемом поведении. Особенный интерес для объектно-ориентированного анализа и проектирования представляют два типа иерархических соотношений объектов: связь и агрегация. Эти два типа отношений можно назвать отношениями старшинства и "отец/потомок" соответственно.
Связь объектов
Румбах определяет связь как "физическое или концептуальное соединение между объектами". Объект сотрудничает с другими объектами через связки, которые соединяют его с ними, с помощью сообщений. Иначе говоря, связь - это специфическое сопоставление, через которое клиент спрашивает об услуге у объекта-сервера или через которое один объект находит путь к другому.
Принимая участие в связи, объект может выполнять одну из следующих трех ролей:
1. Актер. Объект может влиять на другие объекты, но сам никогда не поддается влиянию других объектов; в определенном содержании это отвечает понятию активный объект;
2. Сервер. Объект может лишь поддаваться влиянию со стороны других объектов, но он никогда не выступает в роли объекта, который влияет;
3. Агент. Такой объект может выступать как в активной, так и в пассивной, роли; как правило, объект-агент создается для выполнения операций в интересах
При обеспечении связей между объектами нужно позаботиться об их видимости и синхронизации.
Видимость. Пусть есть два объекта А и В и связь между ними. Для того, чтобы А мог послать сообщение В, нужно, чтобы В был в каком-то содержании видимым для А. Ми можем не заботиться об этом на стадии анализа, но когда дело доходит до реализации системы, мы должны обеспечить видимость связанных объектов.
В принципе есть следующие четыре способа обеспечить видимость.
1. Сервер является глобальным относительно клиента;
2. Сервер (или указание на него) передан клиенту как параметр операции;
3. Сервер является частью клиента.
4. Сервер локально порождается клиентом в ходе выполнения какой-либо операции.
Какой именно из этих способов избрать - зависит от тактики проектирования, которое
будет рассматриваться нами позже.
Синхронизация. Когда один объект посылает за связью сообщение другому, связанному с ним, они, как говорят, синхронизируются. В строго последовательном дополнении синхронизация объектов реализуется именно в запуске метода. Однако во много текущей системе объекты требуют более утонченной схемы передачи сообщений, чтобы развязать проблемы взаимного исключения, типові для параллельных систем. Активные объекты собственно выполняются как потоки, потому присутствие других активных объектов на них обычно не влияет. Если же активный объект имеет связь с пассивным, возможны следующие три подхода к синхронизации:
1. Последовательный — семантика пассивного объекта обеспечивается в присутствии лишь одного активного процесса;
2. Защищенный - семантика пассивного объекта обеспечивается в присутствии многих потоков управления, но активные клиенты должны договориться и обеспечить взаимное исключение;
3. Синхронный - семантика пассивного объекта обеспечивается в присутствии многих потоков управления; взаимное исключение обеспечивает сервер.
Агрегация объектов
В то время, как связки помечают равноправные или "клиент-серверные" отношения между объектами, агрегация описывает отношения целого и части, которые приводят к соответствующей иерархии объектов, причем, идя от целого {агрегату), мы можем прийти к его частям (атрибутам).
Выбирая одно из двух - связь или агрегацию - нужно иметь в виду следующее. Агрегация иногда более подавляюще, поскольку позволяет спрятать части в целом. Иногда наоборот более подавляюще связки, поскольку они слабее и менее ограничительные. При агрегации отпадают проблемы видимости и синхронизации. Принимая решение, нужно взвесить все.
Объект, который является атрибутом другого объекта (агрегату), имеет связь со своим агрегатом. Через эту связь агрегат может посылать ему сообщение, но не наоборот.
|