Обяснено асоцииране, агрегиране и състав в ООП

Унифицираният език за моделиране (UML) е фактически стандарт за моделиране на обектно-ориентирани системи. В UML има пет различни типа връзки: асоцииране, агрегиране, състав, зависимост и наследяване. Тази статия представя дискусия на първите три от тези концепции, оставяйки останалите на друга публикация в блога.

Асоциация в обектно ориентирано програмиране

Асоциацията е семантично слаба връзка (семантична зависимост) между иначе несвързани обекти. Асоциацията е връзка „използване“ между два или повече обекта, в която обектите имат собствен живот и няма собственик.

Като пример, представете си връзката между лекар и пациент. Лекарят може да бъде свързан с множество пациенти. В същото време един пациент може да посети множество лекари за лечение или консултация. Всеки от тези обекти има свой собствен жизнен цикъл и няма „собственик“ или родител. Обектите, които са част от връзката на асоцииране, могат да бъдат създадени и унищожени независимо.

В UML връзката на асоцииране е представена с една стрелка. Връзката на асоцииране може да бъде представена като едно към едно, едно към много или много към много (известно още като кардиналност). По същество връзката на асоциация между два или повече обекта обозначава път на комуникация (наричан още връзка) между тях, така че един обект да може да изпрати съобщение до друг. Следният кодов фрагмент илюстрира как два класа, BlogAccount и BlogEntry, са свързани помежду си.

публичен клас BlogAccount

   {

       частен BlogEntry [] blogEntries;

       // Други членове на класа BlogAccount

   }

публичен клас BlogEntry

   {

       Int32 blogId;

       надпис на низ;

       низ текст;

       // Други членове на класа BlogEntry

   }

Агрегиране в обектно ориентирано програмиране

Агрегирането е специализирана форма на асоцииране между два или повече обекта, в които всеки обект има свой собствен жизнен цикъл, но съществува и собственост. Агрегирането е типична връзка цялост / част или родител / дете, но може или не може да означава физическо ограничаване. Съществено свойство на агрегационната връзка е, че цялото или родителят (т.е. собственикът) може да съществува без частта или детето и обратно.  

Като пример служителят може да принадлежи към един или повече отдели в организацията. Ако обаче отделът на служител бъде изтрит, обектът на служителя няма да бъде унищожен, а ще продължи да живее. Имайте предвид, че връзките между обекти, участващи в агрегиране, не могат да бъдат взаимни - т.е. отдел може да „притежава“ служител, но служителят не притежава отдела. В следващия пример с код е налице връзка за агрегиране между класовете BlogAuthor и BlogAccount.

публичен клас BlogAuthor

   {

       private Int32 authorId;

       частен низ firstName;

       частен низ lastName;

       // Други членове на класа BlogAuthor

   }

публичен клас BlogAccount

   {

       частен BlogEntry [] blogEntries;

       // Други членове на класа BlogAccount

   }

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

Композиция в обектно ориентирано програмиране

Съставът е специализирана форма на агрегиране. В състава, ако родителският обект бъде унищожен, тогава дъщерните обекти също престават да съществуват. Композицията всъщност е силен тип агрегация и понякога се нарича връзка „смърт“. Като пример къщата може да се състои от една или повече стаи. Ако къщата е разрушена, тогава всички стаи, които са част от къщата, също са унищожени. Следният кодов фрагмент илюстрира композиционна връзка между два класа, House и Room.

обществена класа Къща

{

   самостоятелна стая стая;

   публичен дом()

   {

       стая = нова стая ();

   }

}

Подобно на агрегирането, композицията също е връзка цяло / част или родител / дете. Въпреки това, по състав жизненият цикъл на частта или детето се контролира от цялото или родителя, който го притежава. Трябва да се отбележи, че този контрол може да бъде пряк или преходен. Тоест родителят може да е пряко отговорен за създаването или унищожаването на детето или родителят може да използва дете, което вече е създадено. По подобен начин родителският обект може да делегира контролата на друг родител, за да унищожи дъщерния обект. Композицията е представена в UML, като се използва линия, свързваща обектите с плътен диамант в края на обекта, който притежава другия обект.

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

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