Ассоциация

КЛАССЫ

Отношения между объектами

Сами по себе объекты не представляют никакого интереса: только в процессе их взаи­модействия реализуется система. Например, самолет – это «совокупность элементов, каждый из которых по своей природе стремится упасть на землю, но за счет совместных непрерывных усилий преодолевающих эту тенденцию». Он летит только бла­годаря согласованным усилиям своих компонентов.

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

Объект со­трудничает с другими объектами, посылая сообщения через связи, соединяющие его с ними. Связь – это конкретное соединение, через которое объект (клиент) запра­шивает услугу у другого объекта (сервера) или управляет им.

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

Перечислим следу­ющие четыре способа обеспечить видимость:

– сервер глобален по отношению к клиенту;

– сервер (или указатель на него) передан клиенту в качестве параметра операции;

– сервер является частью клиента;

– сервер локально порождается клиентом в ходе выполнения какой-либо операции.

Если связи обозначают равноправные или «клиент-сервер­ные» отношения между объектами, то агрегация описывает отношения целого и части, приводящие к соответствующей иерархии объектов, причем, идя от целого (агрега­та), мы можем прийти к его частям (атрибутам).

Пример. Рассмотрим класс объектов, управляющих температурой в теплице – Controller. Пусть он имеет атрибут h класса Heater (нагреватель).

class Controller {

Heater h;

...

} С;

В данном случае объект C – целое, а h – его часть (часть его состояния). Исходя из контроллера, можно найти соот­ветствующий нагреватель. Однако по h нельзя найти содержащий его объект (на­зываемый также его контейнером), если только сведения о нем слу­чайно не являются частью состояния h.

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

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

Класс – это множество объектов, имеющих общую структуру и общее поведение. Любой конкретный объект является экземпляром класса.

Пример. Рассмотрим сходства и различия между следующими классами: цветы, маргаритки, красные розы, желтые розы, лепестки и пчелы. Мы можем заметить следующее:

– маргаритка – цветок;

– роза – (другой) цветок;

– красная и желтая розы – розы;

– лепесток является частью обоих видов цветов;

– пчелы опыляют цветы и питаются их нектаром.

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

Известны три основных типа отношений между классами. Во-первых, это отношение «обобщение/специализация» (общее и частное), т.е. иерархия «является». Розы являются цветами, что значит: розы являются специализированным частным случа­ем, подклассом более общего класса «цветы». Во-вторых, это отношение «целое/часть», т.е. иерархия «имеет». Например, лепестки являются частью цветов. В-третьих, это семантические, смысловые отношения, ассоциации. Например, пчелы ассоциируются с цветами.

Рассмотрим подробно следующие отношения между классами: ассоциация, агрегация, зависимость, наследование, инстанцирование.

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

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

Пример. Рассмотрим два класса – «Компания» и «Человек». Если рассматривать человека как сотрудника компании, то смысл такой ассоциации – «Место работы» человека, человек выступает в роли «Работника», а компания – в роли «Работодателя». Однако между данными классами может быть и другая ассоциация: если человек является владельцем компании (причем одновременно может являться и ее работником), то он выступает в роли «Собственника», а компания – в роли его «Собственности», смысл ассоциации «Капитал».

Кратность (мощность) ассоциации – это количество ее участников. Различают три случая кратности ассоциации: «один-к-одному», «один-ко-многим», «многие-ко-многим».

Ассоциация «Продажа–Товары» имеет тип «один-ко-многим»: каждый экземпляр товара относится только к одной продаже, в то время как каждой продаже может соответствовать совокупность проданных товаров.

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

Отношение «многие-ко-многим» тоже нередки. Например, каждый объект класса «Покупатель» может иници­ировать сделку с несколькими объектами класса «Продавец», и каждый «Продавец» может взаимодействовать с несколькими объектами класса «Покупатель».

Класс может иметь ас­социацию с самим собой. Такая ас­социация называется рефлексивной.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: