Состав объекта - Object composition

В Информатика, состав объекта это способ объединить объекты или же типы данных на более сложные. Распространенные виды композиций: объекты используется в объектно-ориентированного программирования, отмеченные союзы, наборы, последовательности, и различные график конструкции.[1] Композиции объектов относятся к структурам данных, но не совпадают с ними.

Состав объекта относится к логической или концептуальной структуре информации, а не к реализации или физическому структура данных используется для его представления[нужна цитата ]. Например, последовательность отличается от набор потому что (среди прочего) порядок составных элементов имеет значение для первого, но не для второго. Структуры данных, такие как массивы, связанные списки, хеш-таблицы, и многие другие могут быть использованы для реализации любого из них. Возможно, сбивает с толку то, что одни и те же термины используются как для структур данных, так и для композитов. Например, "двоичное дерево "может относиться к любому: как структура данных, это средство доступа к линейной последовательности элементов, и фактические позиции элементов в дереве не имеют значения (дерево может быть внутренне переупорядочено, как угодно, без изменения его значения). Однако, как объектная композиция, позиции релевантны, и их изменение изменит значение (как, например, в кладограммы )[нужна цитата ].

Техника программирования

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

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

В учебный класс на основе и напечатанный В языках программирования типы могут быть разделены на составные и несоставные типы, а композиция может рассматриваться как связь между типами: объект составного типа (например, машина) "имеет "объекты других типов (например, колесо). Когда составной объект содержит несколько подобъектов одного типа, они могут быть назначены определенным роли, часто различаются по именам или номерам. Например, Точка объект может содержать 3 числа, каждое из которых представляет расстояние по разным осям, например, «x», «y» и «z». Изучение отношений части и целого в целом - это мереология.

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

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

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

Техника моделирования UML

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

В UML При моделировании объекты можно концептуально составлять независимо от реализации на языке программирования. В UML есть четыре способа компоновки объектов: свойство, ассоциация, агрегирование и композиция:[4]

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

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

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

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

Графическое обозначение представляет:

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


Особые формы

Сдерживание

Композиция, которая используется для хранения нескольких экземпляров составного типа данных, называется включением. Примеры таких контейнеров: массивы, ассоциативные массивы, бинарные деревья, и связанные списки.

В UML, содержание изображается с кратностью 0 .. * или 1 .. *, что указывает на то, что составной объект состоит из неизвестного числа экземпляров составного класса.

Рекурсивная композиция

Объекты можно составлять рекурсивно, и их тип затем называется рекурсивный тип. Примеры включают различные виды деревья, Группы DAG, и графики. Каждый узел в дереве может быть ветвью или листом; другими словами, каждый узел является деревом в то же время, когда он принадлежит другому дереву.

В UML рекурсивная композиция изображается как ассоциация, агрегация или композиция класса с самим собой.

Составной узор

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

Составные типы в C

Это пример композиции в C.

структура Человек{  int возраст;  char имя[20];  перечислить {поиск работы, профессиональный, непрофессиональный, на пенсии, ученик} занятость;};

В этом примере примитивные (несоставные) типы int, enum {job_seeking, professional, non_professional, retired, student} и тип составного массива char [] объединяются в составную структуру Человек. Каждый Человек структура тогда "имеет" возраст, имя и тип занятости.

Хронология композиции на разных языках

C называет рекорд структура или структура; объектно-ориентированный языки, такие как Ява, Болтовня, и C ++ часто хранят свои записи внутри объекты (учебный класс экземпляры); языков в ML семья просто называет их записями. КОБОЛ был первым широко распространенным язык программирования напрямую поддерживать записи;[5] АЛГОЛ 68 получил это от COBOL и Паскаль получил его более или менее косвенно из АЛГОЛА 68. Common Lisp предоставляет структуры и классы (последние через Общая объектная система Lisp ).[нужна цитата ]

1959 - КОБОЛ
01  запись клиента.  03  номер клиента     рис 9 (8) комп.  03  Имя Клиента.    05  второе имя       рис х (15).    05  начальная-2         рис x.    05  фамилия           рис х (15).  03  адрес клиента.    05  улица.      07  название улицы     рис х (15).        09  номер дома  рис 999 комп.    05  город              рис x (10).    05  код страны      рис x (3).    05  почтовый индекс          рис x (8).  03  задолженность        рис 9 (8) комп.
1960 - АЛГОЛ 60

Массивы были единственным составным типом данных в Алгол 60.

1964 - PL / I
dcl 1 на основе newtypet (P); 2 (a, b, c) фиксированный интервал (31), 2 (i, j, k) float, 2 r ptr; выделить новый тип;
1968 - АЛГОЛ 68
int max = 99; режим newtypet = [0..9] [0..max] struct (long real a, b, c, short int i, j, k, ref real r); newtypet newarrayt = (1, 2 , 3, 4, 5, 6, реальная куча: = 7)

Например, связанный список может быть объявлен как:

узел режима = объединение (вещественное, целое, соответствие, строка), список = структура (значение узла, следующий список ссылок);

Для АЛГОЛА 68 только имя типа появляется слева от равенства, и, что особенно важно, конструкция выполняется - и может быть прочитана - слева направо без учета приоритетов.

1970 - Паскаль
тип а = множество [1..10] из целое число; б = записывать  а, б, c: настоящий;  я, j, k: целое число; конец;
1972 – K&R C
#define max 99структура новый {  двойной а, б, c;  плавать р;  короткая я, j, k;} Newarrayt[10] [Максимум + 1];
1977 - ФОРТРАН 77

Fortran 77 имеет массивы, но не имеет формальных определений записей / структур. Обычно сложные конструкции возводились с использованием ЭКВИВАЛЕНТНОСТЬ или же ОБЩИЙ заявления:

       ПЕРСОНАЖ ИМЯ*32, ADDR*32, ТЕЛЕФОН*16       НАСТОЯЩИЙ ВЛАДЕНИЕ       ОБЩИЙ /CUST/ИМЯ, ADDR, ТЕЛЕФОН, ВЛАДЕНИЕ
1983 - Ада
тип Cust является записывать  Имя  : Name_Type;  Адрес  : Addr_Type;  Телефон : Phone_Type;  Причитающийся : Целое число классифицировать 1..999999; конец записи;

В Ada 95 концепции ООП реализованы через тегированные типы (эквивалент класса C ++), в Ada 2012 добавлена ​​поддержка замена проверка через общеклассовые контракты.

1983 - C ++
const int Максимум = 99;учебный класс {  общественный:  двойной а, б, c;  плавать &р;  короткая я, j, k;}новый[10] [Максимум + 1];
1991 - Питон
Максимум = 99учебный класс NewTypeT:    def __в этом__(себя):        себя.а = себя.б = себя.c = 0        себя.я = себя.j = себя.k = 0.0# Инициализировать примерный массив этого класса.Newarrayt = [[NewTypeT() за я в классифицировать(Максимум + 1)] за j в классифицировать(10)]
1992 - FORTRAN 90

Массивы и строки были унаследованы от FORTRAN 77, и было введено новое зарезервированное слово: тип

тип новый двойная точность а, б, c целое число*2 я, j, k* Нет тип указателя REF НАСТОЯЩИЙ р тип концатип (новый) т(10, 100)

FORTRAN 90 обновлен и включен FORTRAN IV концепция под названием NAMELIST.

ЦЕЛОЕ :: Ян = 1, фев = 2, мар = 3, апр = 4СПИСОК ИМЕН / неделю / Ян, фев, мар, апр
1994 - ANSI Common Lisp

Common Lisp предоставляет структуры и классы CLOS, добавленные стандартом ANSI Common Lisp.

(defclass какой-то класс ()  ((ж :тип плавать)   (я :тип целое число)   (а :тип (множество целое число (10)))))

Для получения дополнительных сведений о композиции в C / C ++ см. Составной тип.

Агрегация

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

Композиция обычно реализуется таким образом, что объект содержит другой объект. Например, в C ++:

учебный класс Профессор;  // Определено в другом местеучебный класс отделение { общественный:  отделение(const стандартное::нить& заглавие): заглавие_(заглавие) {} частный:  // Агрегация: | Профессора | может пережить | отдел |.  стандартное::вектор<стандартное::weak_ptr<Профессор>> members_;  const стандартное::нить заглавие_;};учебный класс Университет { общественный:  Университет() = дефолт; частный:  // Состав: | Отделения | существуют только до тех пор, пока существует факультет.  стандартное::вектор<отделение> факультет_ = {      отделение("химия"),      отделение("физика"),      отделение("искусство"),  };};

В совокупности объект может содержать только ссылку или указатель на объект (и не иметь продолжительность жизни ответственность за это).

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

Приведенный выше код преобразуется в следующую диаграмму классов UML:

Aggregation-Composition3.png

Агрегация в COM

Агрегация в COM

В Microsoft Компонентная объектная модель, агрегация означает, что объект экспортирует, как если бы он был их владельцем, один или несколько интерфейсы другого объекта, которым он владеет. Формально это больше похоже на сочинение или же инкапсуляция чем агрегация. Однако вместо реализации экспортируемых интерфейсов путем вызова интерфейсов принадлежащего объекта, экспортируются сами интерфейсы принадлежащего объекта. Принадлежащий объект отвечает за обеспечение того, чтобы методы этих интерфейсов, унаследованные от IНеизвестно фактически вызывать соответствующие методы владельца. Это необходимо для гарантии того, что счетчик ссылок владельца верен и все интерфейсы владельца доступны через экспортированный интерфейс, в то время как другие (частные) интерфейсы принадлежащего объекта недоступны.[6]

Смотрите также

Рекомендации

  1. ^ Мишель Язер. «Концепции объектно-ориентированного программирования: состав и агрегирование». Adobe. Получено Одиннадцатое марта, 2015. Композиция - это выражение отношений между объектами. Подумайте о примере стула. У стула есть сиденье. У стула есть спинка. А у стула есть набор ножек. Фраза «имеет» подразумевает отношения, при которых председатель владеет или, как минимум, использует другой объект. Именно эти отношения «есть» и лежат в основе композиции.
  2. ^ Паттерны проектирования: элементы объектно-ориентированного программного обеспечения многократного использования. Гамма, Эрих., Хелм, Ричард (специалист по информатике), Джонсон, Ральф Э., 1955-, Влиссидес, Джон. Ридинг, Массачусетс: Эддисон-Уэсли. 1995 г. ISBN  0-201-63361-2. OCLC  31171684.CS1 maint: другие (связь)
  3. ^ Остерманн, Клаус; Мезини, Мира (1 октября 2001 г.). «Распутанная объектно-ориентированная композиция». Уведомления ACM SIGPLAN. 36 (11): 283–299. Дои:10.1145/504311.504303. ISSN  0362-1340.
  4. ^ а б OMG (2017). «Спецификация унифицированного языка моделирования, версия 2.5.1». www.omg.org. п. 109-110,197-201. Получено 4 октября, 2020.
  5. ^ Себеста, Роберт В. Концепции языков программирования (Третье изд.). Эддисон-Уэсли Паблишинг Компани, Инк. Стр.218. ISBN  0-8053-7133-8.
  6. ^ «Агрегация». Платформа SDK для Windows XP SP2. Microsoft. Получено 4 ноября, 2007.

внешняя ссылка