Агрегація проти складу


206

Я розумію, що таке склад в ООП, але я не в змозі скласти чітке уявлення про те, що таке Агрегація. Може хтось пояснить?

Відповіді:


322

Прості правила:

  1. A "володіє" B = Склад: B не має значення або призначення в системі без A
  2. A "використовує" B = Агрегація: B існує незалежно (концептуально) від A

Приклад 1:

Компанія - це сукупність людей. Компанія - це склад Рахунків. Коли компанія припиняє свою діяльність, її рахунки перестають існувати, але її люди продовжують існувати.

Приклад 2: (дуже спрощено)

Текстовому редактору належить буфер (композиція). Текстовий редактор використовує файл (агрегація). Коли редактор тексту закритий, буфер знищується, але сам файл не знищується.


11
То чи автомобіль є агрегатом чи складом його частин?
reinierpost

2
І чим агрегація відрізняється від будь-яких інших відносин між двома видами сутностей?
reinierpost

55
@reinierpost Насправді машина - це агрегація деталей, а деталі - це просто агрегація молекул ... Однак у моделі все залежить від ваших вимог. Чи важливо ставитися до двигуна як до окремої сутності, щоб ви могли відстежувати його термін експлуатації незалежно від автомобіля? Чи можете ви повторно використовувати такий самий двигун в іншому автомобілі? Якщо так, то ви, мабуть, хочете агрегації. Інакше ви хочете склад, тому що вам не байдуже двигуни, які не входять до складу автомобілів, і ви не переймаєтесь повторним використанням двигунів.
Кертіс Батт

3
чого не вистачає, це приклад реалізації для повного розуміння ...
Чесноков Юрій

1
Що з працівником, коли компанія перестає вести бізнес? Працівник і люди - це різні суб'єкти? Тож чи можу я сказати, що компанія - це склад працівників?
арджун

36

З http://en.wikipedia.org/wiki/Object_composition

Агрегація відрізняється від звичайного складу тим, що вона не передбачає права власності. За складом, коли об’єкт, що володіє, знищується, так і об'єкти, що містяться. У сукупності це не обов'язково вірно. Наприклад, університету належать різні кафедри (наприклад, хімія), і на кожному кафедрі є декілька професорів. Якщо університет закриється, кафедри більше не існуватимуть, але професори на цих кафедрах продовжуватимуть існувати. Отже, університет можна розглядати як склад кафедр, тоді як кафедри - це професори. Крім того, професор може працювати на більш ніж одній кафедрі, але кафедра не може бути частиною більш ніж одного університету.

Отже - хоча у вас є відносини власності зі складом, об'єкт, що належить, також знищується, коли власник є - агрегація (і об'єкти, що містяться) можуть існувати незалежно.

-

Оновлення: Вибачення - ця відповідь є занадто спрощеною задля огляду.

c.batt дає чудове визначення у своїй відповіді: Агрегація проти складу


3
У прикладі, який ви цитуєте, композиція є «багато хто», і агрегація також має на увазі відношення «один до багатьох», хоча тут це також може бути відношення «багато до багатьох» для агрегації (ми можемо припустити, що можливо, що викладач може викладати на кількох кафедрах). Тоді як кафедра не може входити до кількох університетів. Склад передбачає право власності, тоді як агрегація не виходить за рамки взаємозв'язку. Цитата правильна, але коментар - ні.
Ньютопський

1
це не має нічого спільного з руйнуванням! UML не визначає систему збору сміття.
Відображати ім’я

2
Я думаю, що посилання на вікіпедію отримує рефлексивне оновлення, але це жахливе визначення - як @bold вказував, ці стосунки не мають нічого спільного з GC. Це також розпадається, коли предмет є складовою двох інших предметів, наприклад, куля в кульовому суглобі, що з'єднує дві штучні кінцівки. Компонентний зв'язок - це функціональна залежність.
Стівен А. Лоу

1
Я погоджуюсь, що моєї відповіді сильно бракує - але так само і у статті WikiPedia ...
HorusKol

Різниця між складом та агрегацією очевидна. Проблема агрегації полягає в тому, що незрозуміло, чим вона відрізняється від звичайної асоціації.
reinierpost

20

Єдиного пояснення немає. Різні автори означають різні речі за сукупністю. Більшість насправді не означає нічого конкретного.


4
Це правильна відповідь. Я прочитав це у двох книгах, одна з них - « Дистильована UML» Мартіна Фаулера .
davidhaskins


17
  • Склад - Асоціація

  • Агрегація - Асоціація

  • Склад - це сильна асоціація (якщо термін зберігання об'єкта повністю залежить від контейнерного об'єкта, це називається сильною асоціацією)

  • Агрегація є слабкою асоціацією (якщо термін зберігання об'єкта не залежить від контейнерного об'єкта, це називається слабкою асоціацією)

Приклад:

class Contained {
    public void disp() {
        System.out.println("disp() of Contained A");
    }
}

public class Container {
    private Contained c;

    //Composition
    Container() {
        c = new Contained(); 
    }

    //Association 
    public Contained getC() {
        return c;
    }

    public void setC(Contained c) {
        this.c = c;
    }     

    public static void main(String[] args) {
        Container container = new Container();
        Contained contained = new Contained();
        container.setC(contained);
    } 
}

2
Яка різниця між агрегацією та асоціацією, яка не є ні складом, ні агрегацією?
reinierpost

11

Композиція (суміш) - це спосіб об’єднання простих об'єктів або типів даних у більш складні. Композиції є критичним складовим елементом багатьох базових структур даних

Агрегація (колекція) відрізняється від звичайного складу тим, що не передбачає права власності. За складом, коли об’єкт, що володіє, знищується, так і об'єкти, що містяться. У сукупності це не обов'язково відповідає дійсності

╔═══════════╦═════════════════════════╦═══════════════════════╗
║           ║       Aggregation       ║      Composition      ║
╠═══════════╬═════════════════════════╬═══════════════════════╣
║ Life time ║ Have their own lifetime ║ Owner's life time     ║
║ Relation  ║ Has                     ║ part-of               ║
║ Example   ║ Car has driver          ║ Engine is part of Car ║
╚═══════════╩═════════════════════════╩═══════════════════════╝

Обидва позначають зв'язок між об'єктом і відрізняються лише своєю міцністю. введіть тут опис зображення

Нотації UML для різного виду залежності між двома класами введіть тут опис зображення

Склад : Оскільки двигун є частиною автомобіля, відносини між ними складаються. Ось як вони реалізовані між класами Java.

public class Car {
    //final will make sure engine is initialized
    private final Engine engine;  

    public Car(){
       engine  = new Engine();
    }
}

class Engine {
    private String type;
}

Агрегація : Оскільки в Організації є Особа як співробітники, відносини між ними є Агрегацією. Ось як вони виглядають з точки зору класів Java

public class Organization {
    private List employees;
}


public class Person {
    private String name;   
}

Джерело


це, здається, не пропонує нічого суттєвого щодо питань, викладених та пояснених у попередніх 12 відповідях
гнат

Досить впевнені, що книги можуть існувати без бібліотек. Поганий приклад!
T Бланк

Тут Список працівників є частиною об’єкта Організації. Як це може бути агрегація?
Салман Мухаммад Аюб

Чим асоціація відрізняється від сукупності?
reinierpost

Я люблю цю відповідь. Нарешті це мені правильно пояснило, у чому різниця між агрегацією та складом.
PandasRocks

6

агрегація - це проста колекція, як мішок з мармуром

композиція передбачає внутрішні / функціональні залежності, як петлі на коробці

автомобілі агрегатують пасажирів; вони заходять і виходять, не порушуючи функціональність автомобіля

шини - компоненти; видаліть його, і автомобіль більше не працює належним чином

[зверніть увагу: запасна шина - це агрегат!]


1

Я завжди розглядаю склад як "потребує", тобто автомобіль потребує двигуна, і я розглядаю сукупність як "речі, пов'язані з певною метою". Таким чином, дотримуючись аналогії автомобіля, моє агрегування може означати подорож, яка може включати об'єднання автомобіля та пасажирів. Подорож не належить ні автомобілю, ні пасажирам, я агрегую дані, які пов'язані з конкретним сценарієм. Коли подорож завершена, автомобіль і пасажири їдуть далі. Коли автомобіль закінчений, автомобіль і його двигун зазвичай руйнуються разом.


0

Семантично всі набори складаються з підмножини, правда? Тому:

  • Агрегація - це коли ці підмножини існують незалежно від набору батьків. Оскільки монітор можна відключити від комп'ютера для підключення до іншого.

  • Склад складається тоді, коли ці підмножини залежать від існування набору батьків. Оскільки листя - це частина дерева, а печінка - частина тіла.

Ці поняття говорять про тип залежності між двома об'єктами чи класами, концептуально. Безпосередньо в програмі, в агрегації, коли об'єкт батька розпоряджається, об’єкти сукупності також повинні бути розміщені. У тому ж сценарії для композиції складені об'єкти сина зберігатимуться, тоді об'єкт батька відпускається.


-1

Як щодо цього простого прикладу:

Масив об’єктів - це композиція. Масив покажчиків на об’єкти - це агрегація.

Якщо я видалю перший, його вміст зникає разом із ним. Другий, з іншого боку, може зникнути, не впливаючи на існування своїх членів, якщо не існує конкретного методу, який видаляє кожен об'єкт, оскільки його вказівник видаляється.


3
це, мабуть, не додає нічого суттєвого щодо питань, викладених та пояснених у попередніх 11 відповідях
gnat

З повагою не згоден, @gnat. Це корисний приклад того, як вони могли бути реалізовані. Люди краще навчаються на прикладах. (Я прийшов сюди, щоб перевірити своє розуміння того, що член вказівника, швидше за все, був агрегацією, а об’єкт - членом композиції. Це єдина відповідь, щоб безпосередньо вирішити цю проблему.)
Боб Штейн
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.