Состав объекта
![]() |
В информатике и композиция объектов агрегирование объектов — это тесно связанные способы объединения объектов или типов данных в более сложные. В разговоре часто игнорируется различие между композицией и агрегацией. [1] Распространенными видами композиций являются объекты, используемые в объектно-ориентированном программировании , теговые объединения , множества , последовательности и различные графовые структуры. Композиции объектов относятся к структурам данных, но не являются ими.
Композиция объекта относится к логической или концептуальной структуре информации, а не к реализации или физической структуре данных , используемой для ее представления. [ нужна цитата ] . Например, последовательность отличается от набора тем, что (помимо прочего) порядок составленных элементов имеет значение для первого, но не для второго. Структуры данных, такие как массивы , связанные списки , хеш-таблицы и многие другие, могут использоваться для реализации любого из них. Возможно, это сбивает с толку то, что некоторые из одних и тех же терминов используются как для структур данных, так и для композитов. Например, « двоичное дерево » может относиться к любому из двух: как к структуре данных оно представляет собой средство доступа к линейной последовательности элементов, а фактическое положение элементов в дереве не имеет значения (дерево можно внутренне переупорядочить как угодно). не меняя его смысла). Однако в качестве объектной композиции позиции имеют значение, и их изменение приведет к изменению значения (как, например, в кладограммах ). [ нужна цитата ] .
Техника программирования [ править ]
Объектно-ориентированное программирование основано на объектах для инкапсуляции данных и поведения. Он использует два основных метода сборки и объединения функциональности в более сложные: подтипирование и композицию объектов. [2] Композиция объектов — это объединение объектов внутри составных объектов и в то же время обеспечение инкапсуляции каждого объекта с использованием их четко определенного интерфейса без видимости их внутренних компонентов. В этом отношении композиция объектов отличается от структур данных, которые не требуют инкапсуляции.
Композиция объектов также может представлять собой группу из нескольких связанных объектов, например набор или последовательность объектов. Делегирование может обогатить композицию путем перенаправления запросов или вызовов, сделанных к включающему составному объекту, одному из его внутренних компонентов. [3]
В классовых и типизированных языках программирования типы можно разделить на составные и несоставные типы, а композицию можно рассматривать как связь между типами: объект составного типа (например, автомобиль ) « имеет » объекты других типов ( например, колесо ). Когда составной объект содержит несколько подобъектов одного типа, им могут быть назначены определенные роли , часто отличающиеся именами или номерами. Например, объект Point может содержать три числа, каждое из которых представляет расстояние по разным осям, например «x», «y» и «z». Изучение отношений части и целого в целом является мереологией .
Композицию следует отличать от подтипирования , которое представляет собой процесс добавления деталей к общему типу данных для создания более конкретного типа данных. Например, автомобили могут относиться к определенному типу транспортных средств: car — это транспортное средство . Подтипирование не описывает отношения между различными объектами, а говорит о том, что объекты одного типа одновременно являются объектами другого типа. Изучением таких отношений является онтология .
В прототипах языках программирования, основанных на , таких как JavaScript , объекты могут динамически наследовать поведение объекта-прототипа в момент их создания. Композицию следует отличать от прототипирования: вновь созданный объект наследует композицию своего прототипа, но сам может быть составлен самостоятельно.
Составные объекты могут быть представлены в хранилище путем совместного размещения составных объектов, совместного размещения ссылок или многими другими способами. Элементы внутри составного объекта могут называться атрибутами , полями , членами , свойствами или другими именами, а результирующая композиция — составным типом , записью хранения , структурой , кортежем или определяемым пользователем типом (UDT) . Подробную информацию см. в разделе агрегирования ниже.
Техника UML-моделирования [ править ]
![Класс велосипеда, представленный в UML, с тремя свойствами: седлом, колесами и деталями, причем два последних имеют кратность, указывающую на несколько объектов.](http://upload.wikimedia.org/wikipedia/commons/thumb/4/4f/UML_properties_of_a_bicycle.png/220px-UML_properties_of_a_bicycle.png)
При моделировании UML объекты могут быть концептуально составлены независимо от реализации на языке программирования. В UML существует четыре способа составления объектов: свойство, ассоциация, агрегация и композиция: [4]
- Свойство представляет атрибут класса.
- Ассоциация представляет собой семантическую связь между экземплярами связанных классов. Конец-член ассоциации соответствует свойству связанного класса.
- Агрегация — это своего рода ассоциация, которая моделирует отношения часть/целое между агрегатом (целым) и группой связанных компонентов (частей).
- Композиция, также называемая составной агрегацией, представляет собой своего рода агрегацию, которая моделирует отношения часть/целое между составным элементом (целым) и группой частей, находящихся в исключительном владении.
Связь между агрегатом и его компонентами представляет собой слабую связь «имеет»: компоненты могут быть частью нескольких агрегатов, к ним можно получить доступ через другие объекты, не проходя через агрегат, и они могут пережить агрегатный объект. [4] Состояние объекта-компонента по-прежнему является частью агрегатного объекта. [ нужна цитата ]
Связь между составным объектом и его частями представляет собой сильную связь «имеет»: составной объект несет исключительную « ответственность за существование и хранение составных объектов », составной объект может быть частью не более чем одного составного объекта, и « При удалении составного объекта все экземпляры его частей, являющиеся объектами, удаляются вместе с ним ». Таким образом, в UML композиция имеет более узкое значение, чем обычная композиция объектов.
![Объединение нескольких велосипедов, каждый из которых имеет одного владельца; Состав велосипеда с деталями рамы, из которых состоит велосипед; и совокупность велосипеда с его колесами, существующими без велосипеда](http://upload.wikimedia.org/wikipedia/commons/thumb/2/21/UML_association%2C_aggregation_and_composition_examples_for_a_bicycle.png/220px-UML_association%2C_aggregation_and_composition_examples_for_a_bicycle.png)
Графическое обозначение представляет:
- свойство как типизированный элемент в поле включающего класса,
- ассоциация как простая линия между связанными классами,
- агрегат , в виде незаполненного ромба сбоку от агрегата и сплошной линии
- композиция в виде заполненного ромба сбоку от композита и сплошной линии.
Агрегация [ править ]
Агрегация отличается от обычной композиции тем, что не предполагает владения. В композиции, когда объект-владелец уничтожается, уничтожаются и содержащиеся в нем объекты. В совокупности это не обязательно так. Например, в университете есть различные факультеты (например, химический ), и на каждом факультете работает несколько профессоров. Если университет закроется, кафедр больше не будет, но профессора на этих кафедрах продолжат существовать. Таким образом, университет можно рассматривать как совокупность кафедр, тогда как кафедры представляют собой совокупность профессоров. Кроме того, профессор мог работать более чем на одной кафедре, но кафедра не могла входить более чем в один университет.
Композиция обычно реализуется таким образом, что один объект содержит другой объект. Например, в С++ :
классный профессор ; // Определено в другом месте
class Department {
public :
Department ( const std :: string & title ) : title_ ( title ) {}
Private :
// Агрегация: |Professors| может пережить |Департамент|.
std :: vector < std :: weak_ptr < Профессор >> members_ ;
const std :: строка title_ ;
};
класс University {
public :
University () = по умолчанию ;
Private :
// Состав: |Кафедры|существуют только до тех пор, пока существует факультет.
std :: vector < Кафедра > факультет_ = {
Кафедра ( "химия" ),
Кафедра ( "физика" ),
Кафедра ( "искусство" ),
};
};
При агрегировании объект может содержать только ссылку или указатель на объект (и не нести за него пожизненную ответственность).
Иногда агрегацию называют композицией, когда различие между обычной композицией и агрегацией неважно.
Приведенный выше код преобразуется в следующую диаграмму классов UML:
Агрегация в COM [ править ]
![](http://upload.wikimedia.org/wikipedia/commons/thumb/d/dc/Simple_COM_aggregation_diagram.svg/220px-Simple_COM_aggregation_diagram.svg.png)
Microsoft В объектной модели компонентов агрегирование означает, что объект экспортирует, как если бы он был его владельцем, один или несколько интерфейсов другого объекта, которым он владеет. Формально это больше похоже на композицию или инкапсуляцию , чем на агрегацию. Однако вместо реализации экспортированных интерфейсов путем вызова интерфейсов принадлежащего объекта экспортируются сами интерфейсы принадлежащего объекта. Принадлежащий объект отвечает за обеспечение того, чтобы методы этих интерфейсов, унаследованных от IUnknown фактически вызывает соответствующие методы владельца. Это необходимо для того, чтобы гарантировать, что счетчик ссылок владельца правильный и все интерфейсы владельца доступны через экспортированный интерфейс, в то время как другие (частные) интерфейсы принадлежащего объекта недоступны. [5]
Специальные формы [ править ]
Сдерживание [ править ]
Композиция, которая используется для хранения нескольких экземпляров составного типа данных, называется вложением. Примерами таких контейнеров являются массивы , ассоциативные массивы , двоичные деревья и связанные списки .
В UML включение изображается с кратностью 0..* или 1..*, что указывает на то, что составной объект состоит из неизвестного количества экземпляров составного класса.
Рекурсивная композиция [ править ]
Объекты можно составлять рекурсивно, и их тип тогда называется рекурсивным типом . Примеры включают в себя различные виды деревьев , группы DAG и графы . Каждый узел дерева может быть ветвью или листом; другими словами, каждый узел является деревом в то же время, когда он принадлежит другому дереву.
В UML рекурсивная композиция изображается с помощью ассоциации, агрегации или композиции класса с самим собой.
Составной узор [ править ]
Шаблон составного проектирования — это объектно-ориентированный дизайн, основанный на составных типах, который сочетает в себе рекурсивную композицию и включение для реализации сложных иерархий части-целого.
Составные типы в C [ править ]
Это пример композиции C. в
struct Person
{
int age ;
персонажа имя [ 20 ];
enum { ищу работу , профессиональный , непрофессиональный , пенсионер , студент } занятость ;
};
В этом примере примитивные (несоставные) типы интервал , enum {job_seeking, professional,non_professional,пенсионер,студент } и тип составного массива char[] объединяются в составную структуру Человек . Каждый Тогда структура человека «имеет» возраст, имя и тип занятости.
Хронология композиции на разных языках [ править ]
C называет запись структурой или структурой; объектно-ориентированные языки, такие как Java , Smalltalk и C++, часто скрывают свои записи внутри объектов ( экземпляров классов ); языки семейства ML называют их просто записями. COBOL был первым широко распространенным языком программирования , который напрямую поддерживал записи; [6] АЛГОЛ 68 получил его от COBOL, а Паскаль получил его, более или менее косвенно, от АЛГОЛ 68. Common Lisp предоставляет структуры и классы (последние через Common Lisp Object System ). [ нужна цитата ]
- 1959 – КОБОЛ
01 запись клиента .
03 номер клиента рис. 9(8) комп .
03 имя клиента .
05 именных картинок x(15) .
05 начальная-2 картинка x .
05 фамилия фото x(15) .
03 адрес клиента .
05 улица .
07 фото названия улицы x(15) .
09 номер дома фото 999 комп .
05 картинка города x(10) .
05 картинка кода страны x(3) .
05 почтовый индекс рис. x(8) .
03 сумма задолженности фото 9(8) комп .
- 1960 – АЛГОЛ 60
Массивы были единственным составным типом данных в Algol 60 .
- 1964 - ПЛ/И
dcl 1 на основе нового типа (P); 2 (а, б, в) фиксированный бункер(31), 2 (i, j, k) плавающий, 2 р птр; выделить новый тип;
- 1968 – АЛГОЛ 68
интервал Макс = 99; режим newtypet = [0..9] [0..max]struct ( длинный реальный a, b, c, короткий int i, j, k, ref реальный r ); newtypet newarrayt = (1, 2, 3, 4, 5, 6, куча вещественная: = 7)
Например, связанный список может быть объявлен как:
режим node = объединение (real, int, compl, строка), list = struct (значение узла, список ссылок следующий);
В АЛГОЛе 68 слева от равенства появляется только имя типа, и, что особенно важно, конструкция создается – и ее можно читать – слева направо, без учета приоритетов.
- 1970 – Паскаль
введите
a = массив [ 1 .. 10 ] целых чисел ;
б = запись
а , б , с : реальный ;
я , j , k : целое число ;
конец ;
- 1972 – К&Р С
#define max 99
struct newtypet {
double a , b , c ;
плавать р ;
короткий я , j , k ;
} Новый массив [ 10 ] [ макс + 1 ];
- 1977 – ФОРТРАН 77
В Фортране 77 есть массивы, но отсутствуют какие-либо формальные определения записей/структур. Обычно составные конструкции создавались с использованием ЭКВИВАЛЕНТНОСТЬ или ОБЫЧНЫЕ утверждения:
ПЕРСОНАЖА ИМЯ * 32 , АДРЕС * 32 , ТЕЛЕФОН * 16
REAL OWING
COMMON / CUST / NAME , ADDR , PHONE , OWING
- 1983 – Ада
тип Cust —
записи
имя : Name_Type ;
Адрес : Тип_адреса ;
Телефон : Тип_телефона ;
Должен : Целочисленный диапазон 1. . 999999 ;
завершить запись ;
В Ada 95 концепции ООП реализованы через тегированные типы (эквивалент класса C++), в Ada 2012 добавлена поддержка проверки замены посредством общеклассовых контрактов.
- 1983 – С++
const int max = 99 ;
класс {
общественный :
двойной а , б , с ;
плавать & р ;
короткий я , j , k ;
} Newtypet [ 10 ] [ макс + 1 ];
- 1991 – «Питон»
max = 99
класс NewTypeT :
def __init__ ( self ):
self . а = сам . б = сам . с = 0
сам . я = я . j = сам . k = 0.0
# Инициализируем пример массива этого класса.
newarrayt = [[ NewTypeT () для i в диапазоне ( max + 1 )] для j в диапазоне ( 10 )]
- 1992 – ФОРТРАН 90
Массивы и строки были унаследованы от FORTRAN 77, и было введено новое зарезервированное слово: type
тип newtypet
двойной точности a , b , c
целое число * 2 i , j , k
* без Тип указателя REF REAL R
конечного типа
тип ( newtypet ) t ( 10 , 100 )
FORTRAN 90 обновлен и включает FORTRAN IV концепцию под названием NAMELIST.
ЦЕЛОЕ ЧИСЛО :: январь = 1 , февраль = 2 , март = 3 , апрель = 4
СПИСОК ИМЕН / неделя / январь , февраль , март , апрель
- 1994 – ANSI Common Lisp
Common Lisp предоставляет структуры, а стандарт ANSI Common Lisp добавил классы CLOS.
( defclass some-class ()
(( f :type float )
( i :type целое число )
( a :type ( массива целое число ( 10 )))))
Дополнительные сведения о композиции в C/C++ см. в разделе Составной тип .
См. также [ править ]
- Структура С++
- Составной тип
- Композиция важнее наследования
- Делегирование (программирование)
- Функциональная композиция (информатика)
- Имеет
- Наследование реализации
- Семантика наследования
- Закон Деметры
- Объектно-ориентированный анализ и проектирование
- Виртуальное наследование
Ссылки [ править ]
- ^ Ясер, Мишель. «Концепции объектно-ориентированного программирования: композиция и агрегирование» . Архивировано из оригинала 8 апреля 2015 года.
Существует тесно связанное с композицией понятие, называемое агрегацией. В разговоре часто игнорируются различия между композицией и агрегацией.
- ^ Шаблоны проектирования: элементы многоразового объектно-ориентированного программного обеспечения . Гамма, Эрих., Хелм, Ричард (ученый-компьютерщик), Джонсон, Ральф Э., 1955-, Влиссидес, Джон. Ридинг, Массачусетс: Аддисон-Уэсли. 1995. ISBN 0-201-63361-2 . ОСЛК 31171684 .
{{cite book}}
: CS1 maint: другие ( ссылка ) - ^ Остерманн, Клаус; Мезини, Мира (1 октября 2001 г.). «Распутывание объектно-ориентированной композиции» . Уведомления ACM SIGPLAN . 36 (11): 283–299. дои : 10.1145/504311.504303 . ISSN 0362-1340 .
- ^ Перейти обратно: а б ОМГ (2017). «Спецификация унифицированного языка моделирования, версия 2.5.1» . www.omg.org . п. 109-110,197-201 . Проверено 4 октября 2020 г.
- ^ «Агрегация» . Платформенный SDK для Windows XP SP2 . Майкрософт . Проверено 4 ноября 2007 г.
- ^ Себеста, Роберт В. Концепции языков программирования (Третье изд.). Аддисон-Уэсли Паблишинг Компани, Инк. с. 218 . ISBN 0-8053-7133-8 .
Внешние ссылки [ править ]
- Ассоциация, агрегация и состав , по состоянию на февраль 2009 г.
- Харальд Стеррле, UML2, Аддисон-Уэсли, 2005 г.