Введение
Метод в компьютерном программировании формирования объектов более высокого уровня.
В информатике, состав объектов и агрегация объектов – тесно связанные способы объединения объектов или типов данных в более сложные. В повседневной речи различие между композицией и агрегацией часто игнорируется. Распространенные виды композиций – это объекты, используемые в объектно-ориентированном программировании, типы с вариантами, множества, последовательности и различные графовые структуры. Композиции объектов связаны с, но не идентичны, структурам данных. Композиция объекта относится к логической или концептуальной структуре информации, а не к реализации или физической структуре данных, используемой для её представления. Например, последовательность отличается от множества, поскольку (среди прочего) порядок составляющих элементов важен для первой, но не для второй. Структуры данных, такие как массивы, связные списки, хеш-таблицы и многие другие, могут быть использованы для реализации любой из них. Порой сбивает с толку то, что одни и те же термины используются как для структур данных, так и для композитов. Например, "бинарное дерево" может означать: как структура данных – это способ доступа к линейной последовательности элементов, при этом фактическое положение элементов в дереве не имеет значения (дерево можно внутренне перестраивать как угодно, не меняя его смысл). Однако, как композиция объекта, положение элементов имеет значение, и их изменение изменит смысл (например, в кладограммах).
Техника программирования
Объектно-ориентированное программирование основано на объектах для инкапсуляции данных и поведения. Оно использует два основных подхода к сборке и композиции функциональности в более сложные конструкции: подтипирование и композицию объектов. Композиция объектов заключается в объединении объектов в составные объекты, при этом обеспечивается инкапсуляция каждого объекта посредством использования его чётко определённого интерфейса, без доступа к его внутреннему устройству. В этом отношении композиция объектов отличается от структур данных, которые не обеспечивают инкапсуляцию. Композиция объектов может также представлять собой группу взаимосвязанных объектов, таких как набор или последовательность объектов. Делегирование может расширить возможности композиции, перенаправляя запросы или вызовы, сделанные к составному объекту, одному из его внутренних компонентов. В языках программирования, основанных на классах и типах, типы можно разделить на составные и не составные, а композицию можно рассматривать как отношение между типами: объект составного типа (например, автомобиль) "содержит" объекты других типов (например, колесо). Когда составной объект содержит несколько под-объектов одного типа, им могут быть назначены определённые роли, часто различаемые по именам или номерам. Например, объект "точка" может содержать 3 числа, каждое из которых представляет расстояние по различной оси, например, 'x', 'y' и 'z'. Изучение отношений части и целого в общем виде называется мереологией. Композицию следует отличать от подтипирования, которое представляет собой процесс добавления деталей к общему типу данных для создания более конкретного типа данных. Например, автомобили могут быть конкретным типом транспортного средства: автомобиль является транспортным средством. Подтипирование не описывает отношение между разными объектами, а утверждает, что объекты одного типа одновременно являются объектами другого типа. Изучение таких отношений называется онтологией. В языках программирования, основанных на прототипах, таких как JavaScript, объекты могут динамически наследовать поведение от прототипного объекта в момент их создания. Композицию следует отличать от прототипирования: вновь созданный объект наследует композицию своего прототипа, но сам может быть создан на её основе. Составные объекты могут быть представлены в памяти путём совместного размещения составляющих объектов, совместного размещения ссылок или другими способами. Элементы внутри составного объекта могут называться атрибутами, полями, членами, свойствами или другими именами, а полученная композиция – составным типом, записью хранения, структурой, кортежем или пользовательским типом данных (UDT). Подробности см. в разделе "Агрегация" ниже.
Методика моделирования UML
В моделировании UML объекты могут быть концептуально скомпонованы независимо от реализации с помощью языка программирования. Существует четыре способа компоновки объектов в UML: свойство, ассоциация, агрегация и композиция:
Свойство представляет собой атрибут класса. Ассоциация представляет собой семантическую связь между экземплярами связанных классов. Конец ассоциации соответствует свойству связанного класса. Агрегация – это разновидность ассоциации, моделирующая отношение часть/целое между агрегатом (целым) и группой связанных компонентов (частей). Композиция, также называемая композитной агрегацией, – это разновидность агрегации, моделирующая отношение часть/целое между композитом (целым) и группой исключительно принадлежащих частей. Отношение между агрегатом и его компонентами является слабым отношением "имеет": компоненты могут быть частью нескольких агрегатов, могут быть доступны через другие объекты, минуя агрегат, и могут существовать дольше, чем объект-агрегат.
Сдерживание
Композиция, используемая для хранения нескольких экземпляров составного типа данных, называется инкапсуляцией. Примерами таких контейнеров являются массивы, ассоциативные массивы, двоичные деревья и связанные списки. В UML инкапсуляция изображается с множественностью 0 * или 1 *, указывая, что составной объект состоит из неизвестного числа экземпляров составленного класса.
Рекурсивная композиция
Объекты могут быть составлены рекурсивно, и их тип называется рекурсивным типом. Примеры включают различные виды деревьев, DAG и графов. Каждый узел в дереве может быть ветвью или листом; иными словами, каждый узел одновременно является деревом и частью другого дерева. В UML рекурсивная композиция изображается ассоциацией, агрегацией или композицией класса с самим собой.
Композитный рисунок
Композитный шаблон проектирования — это объектно-ориентированный шаблон, основанный на композитных типах, который объединяет рекурсивный состав и включение для реализации сложных иерархий "часть-целое".