~~~~~~~~~~~~~~~~~~~~ Arc.Ask3.Ru ~~~~~~~~~~~~~~~~~~~~~ 
Номер скриншота №:
✰ CE896CAFB2E1D2971120FC0E72D566E0__1694302680 ✰
Заголовок документа оригинал.:
✰ Object composition - Wikipedia ✰
Заголовок документа перевод.:
✰ Композиция предметов — Википедия ✰
Снимок документа находящегося по адресу (URL):
✰ https://en.wikipedia.org/wiki/Object_composition ✰
Адрес хранения снимка оригинал (URL):
✰ https://arc.ask3.ru/arc/aa/ce/e0/ce896cafb2e1d2971120fc0e72d566e0.html ✰
Адрес хранения снимка перевод (URL):
✰ https://arc.ask3.ru/arc/aa/ce/e0/ce896cafb2e1d2971120fc0e72d566e0__translat.html ✰
Дата и время сохранения документа:
✰ 21.06.2024 11:19:41 (GMT+3, MSK) ✰
Дата и время изменения документа (по данным источника):
✰ 10 September 2023, at 02:38 (UTC). ✰ 

~~~~~~~~~~~~~~~~~~~~~~ Ask3.Ru ~~~~~~~~~~~~~~~~~~~~~~ 
Сервисы Ask3.ru: 
 Архив документов (Снимки документов, в формате HTML, PDF, PNG - подписанные ЭЦП, доказывающие существование документа в момент подписи. Перевод сохраненных документов на русский язык.)https://arc.ask3.ruОтветы на вопросы (Сервис ответов на вопросы, в основном, научной направленности)https://ask3.ru/answer2questionТоварный сопоставитель (Сервис сравнения и выбора товаров) ✰✰
✰ https://ask3.ru/product2collationПартнерыhttps://comrades.ask3.ru


Совет. Чтобы искать на странице, нажмите Ctrl+F или ⌘-F (для MacOS) и введите запрос в поле поиска.
Arc.Ask3.ru: далее начало оригинального документа

Композиция предметов — Википедия Jump to content

Состав объекта

Из Википедии, бесплатной энциклопедии

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

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

Техника программирования [ править ]

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

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

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

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

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

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

Техника UML-моделирования [ править ]

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

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

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

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

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

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

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

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

Агрегация [ править ]

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

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

классный   профессор  ;     // Определено в другом месте 

 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 [ править ]

Агрегация в COM

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++ см. в разделе Составной тип .

См. также [ править ]

Ссылки [ править ]

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

Внешние ссылки [ править ]

Arc.Ask3.Ru: конец оригинального документа.
Arc.Ask3.Ru
Номер скриншота №: CE896CAFB2E1D2971120FC0E72D566E0__1694302680
URL1:https://en.wikipedia.org/wiki/Object_composition
Заголовок, (Title) документа по адресу, URL1:
Object composition - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть, любые претензии не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, денежную единицу можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)