Agregacja a kompozycja

205

Rozumiem, jaki jest skład OOP, ale nie jestem w stanie jasno zrozumieć, czym jest agregacja. Czy ktoś może wyjaśnić?

Vinoth Kumar CM
źródło

Odpowiedzi:

321

Proste zasady:

  1. A „posiada” B = Skład: B nie ma znaczenia ani celu w systemie bez A.
  2. „Używa” B = agregacja: B istnieje niezależnie (koncepcyjnie) od A

Przykład 1:

Firma to agregacja Ludzi. Firma to zestawienie kont. Kiedy Firma przestaje prowadzić działalność, jej Konta przestają istnieć, ale Ludzie nadal istnieją.

Przykład 2: (bardzo uproszczony)

Edytor tekstu jest właścicielem bufora (kompozycji). Edytor tekstu używa pliku (agregacji). Gdy edytor tekstu jest zamknięty, bufor jest niszczony, ale sam plik nie jest niszczony.

Curtis Batt
źródło
11
Czy więc samochód jest agregatem czy kompozycją jego części?
reinierpost
2
A czym różni się agregacja od jakiejkolwiek innej relacji między dwoma rodzajami bytów?
reinierpost
55
@reinierpost W rzeczywistości samochód to agregacja części, a części to po prostu agregacja cząsteczek ... Jednak w modelu wszystko zależy od twoich wymagań. Czy ważne jest, aby traktować silnik jako oddzielny byt, abyś mógł śledzić jego żywotność niezależnie od samochodu? Czy możesz ponownie użyć dokładnie tego samego silnika w innym samochodzie? Jeśli tak, to prawdopodobnie chcesz agregacji. W przeciwnym razie chcesz kompozycji, ponieważ nie obchodzi Cię silniki, które nie są częścią samochodów, ani nie obchodzi Cię ponowne użycie silników.
Curtis Batt
3
brak jest przykładu implementacji dla pełnego zrozumienia ...
Chesnokov Yuriy
1
Co z pracownikiem, gdy firma przestaje prowadzić działalność? Pracownik i ludzie to różne podmioty, prawda? Czy mogę więc powiedzieć, że firma to skład pracowników?
arjun
36

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

Agregacja różni się od zwykłego składu tym, że nie implikuje własności. W składzie, gdy obiekt będący właścicielem jest niszczony, podobnie jak zawarte w nim obiekty. Podsumowując, niekoniecznie jest to prawda. Na przykład uniwersytet jest właścicielem różnych wydziałów (np. Chemii), a każdy wydział ma wielu profesorów. Jeśli uniwersytet zostanie zamknięty, wydziały przestaną istnieć, ale profesorowie na tych wydziałach będą nadal istnieć. Dlatego uniwersytet może być postrzegany jako kompozycja wydziałów, podczas gdy wydziały mają agregację profesorów. Ponadto profesor może pracować na więcej niż jednym wydziale, ale wydział nie może być częścią więcej niż jednego uniwersytetu.

Tak więc - gdy masz stosunek własności do kompozycji, posiadany obiekt jest również niszczony, gdy właścicielem jest - agregacja (i zawarte w nim obiekty) może istnieć niezależnie.

-

Aktualizacja: Przeprosiny - z perspektywy czasu ta odpowiedź jest zbyt uproszczona.

c.batt podaje doskonałą definicję w swojej odpowiedzi: Agregacja vs Kompozycja

HorusKol
źródło
3
W tym przykładzie cytujesz, że kompozycja jest relacją jeden do wielu, a agregacja ma również implikowany stosunek jeden do wielu, chociaż tutaj może to być również relacja wiele do wielu dla agregacji (możemy przypuszczać, że możliwe nauczyciel może uczyć w wielu działach). Podczas gdy wydział nie może być częścią wielu uniwersytetów. Skład oznacza własność, podczas gdy agregacja nie wykracza poza związek. Cytat jest poprawny, ale komentarz nie.
Newtopian
1
nie ma to nic wspólnego ze zniszczeniem! UML nie definiuje systemu usuwania śmieci.
Nazwa wyświetlana
2
myślę, że link do wikipedii zyskuje zwrotne opinie, ale jest to okropna definicja - jak zauważył @bold, te relacje nie mają nic wspólnego z GC. To również rozpada się, gdy obiekt jest składnikiem dwóch innych obiektów, takich jak kula w przegubie kulowym łączącym dwie sztuczne kończyny. Relacja komponentu dotyczy zależności funkcjonalnej.
Steven A. Lowe
1
Zgadzam się, że bardzo brakuje mojej odpowiedzi - ale także artykuł WikiPedia ...
HorusKol
Różnica między kompozycją a agregacją jest wyraźna. Problem z agregacją polega na tym, że nie jest jasne, jak różni się od zwykłego skojarzenia.
reinierpost
20

Nie ma jednego wyjaśnienia. Różni autorzy oznaczają różne rzeczy przez agregację. Większość tak naprawdę nie ma na myśli niczego konkretnego.

reinierpost
źródło
4
To jest poprawna odpowiedź. Przeczytałem go w dwóch książkach, z których jedna to UML Distilled Martina Fowlera .
davidhaskins
16
  • Skład jest stowarzyszeniem

  • Agregacja jest stowarzyszeniem

  • Skład jest mocny Association (Jeśli życie zamkniętego obiektu całkowicie zależy od obiektu kontenera, nazywa się to silny związek)

  • Agregacja jest słaby Association (Jeśli życie zamkniętego obiektu nie zależy od obiektu kontenera, nazywa się słaby stowarzyszenie)

Przykład:

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);
    } 
}
Pawan
źródło
2
Jaka jest różnica między agregacją a asocjacją, która nie jest ani kompozycją, ani agregacją?
reinierpost
11

Kompozycja (mieszanina) to sposób łączenia prostych obiektów lub typów danych w bardziej złożone. Kompozycje są kluczowym elementem składowym wielu podstawowych struktur danych

Agregacja (kolekcja) różni się od zwykłego składu tym, że nie implikuje własności. W składzie, gdy obiekt będący właścicielem jest niszczony, podobnie jak zawarte w nim obiekty. Podsumowując, niekoniecznie jest to prawda

╔═══════════╦═════════════════════════╦═══════════════════════╗
║           ║       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 ║
╚═══════════╩═════════════════════════╩═══════════════════════╝

Oba oznaczają relacje między przedmiotem i różnią się jedynie siłą. wprowadź opis zdjęcia tutaj

Notacje UML dla różnego rodzaju zależności między dwiema klasami wprowadź opis zdjęcia tutaj

Skład : ponieważ silnik jest częścią samochodu, związek między nimi jest skład. Oto jak są one implementowane pomiędzy klasami 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;
}

Agregacja : Ponieważ organizacja ma osobę jako pracownika, relacja między nimi jest agregacją. Oto jak wyglądają pod względem klas Java

public class Organization {
    private List employees;
}


public class Person {
    private String name;   
}

Źródło

Premraj
źródło
wydaje się, że nie oferuje to nic istotnego w porównaniu z punktami przedstawionymi i wyjaśnionymi w poprzednich 12 odpowiedziach
komnata
Z pewnością książki mogą istnieć bez bibliotek. Zły przykład!
T Blank
Tutaj lista pracowników jest częścią obiektu organizacji. Jak może to być agregacja?
Salman Muhammad Ayub
Czym różni się asocjacja od agregacji?
reinierpost
Uwielbiam tę odpowiedź. W końcu wyjaśniło mi to właściwie, jaka jest różnica między agregacją a kompozycją.
PandasRocks,
6

agregacja jest prostą kolekcją, jak worek kulek

skład sugeruje zależności wewnętrzne / funkcjonalne, takie jak zawiasy na pudełku

samochody gromadzą pasażerów; wsiadają i wysiadają bez naruszania funkcjonalności samochodu

opony są częściami; usuń jeden, a samochód przestanie działać poprawnie

[uwaga: koło zapasowe jest sumą!]

Steven A. Lowe
źródło
1

Zawsze patrzę na kompozycję jako „potrzebuje”, tzn. Samochód potrzebuje silnika, a agregację na „rzeczy powiązane z określonym celem”. Tak więc pozostając przy analogii samochodu, moją agregacją może być przedstawienie podróży, która może obejmować połączenie samochodu i pasażerów. Podróż nie jest właścicielem samochodu ani pasażerów, zbieram dane związane z konkretnym scenariuszem. Po zakończeniu podróży samochód i pasażerowie kontynuują podróż. Kiedy samochód się kończy, samochód i jego silnik są zwykle niszczone razem.

Łazarz
źródło
0

Semantycznie wszystkie zestawy składają się z podzbiorów, prawda? W związku z tym:

  • Agregacja ma miejsce, gdy te podzbiory istnieją niezależnie od zbioru nadrzędnego. Jako monitor można odłączyć od komputera, aby podłączyć go do innego.

  • Kompozycja ma miejsce, gdy te podzbiory zależą od istnienia zbioru ojca. Ponieważ liść jest częścią drzewa, a wątroba jest częścią ciała.

Te koncepcje mówią o rodzaju zależności między dwoma obiektami lub klasami, koncepcyjnie. Bezpośrednio w programie, w agregacji, gdy obiekt-ojciec usuwa, obiekty-agregaty również powinny zostać usunięte. W tym samym scenariuszu dla kompozycji złożone obiekty syn pozostaną, a następnie obiekt-ojciec zostanie wydany.

Negarrak
źródło
-1

A może ten prosty przykład:

Tablica obiektów jest kompozycją. Tablica wskaźników do obiektów jest agregacją.

Jeśli usunę pierwszy, jego zawartość zniknie wraz z nim. Drugi natomiast może zniknąć bez wpływu na istnienie jego członków, chyba że istnieje specjalna metoda, która usuwa każdy obiekt po usunięciu jego wskaźnika.

użytkownik 2831074
źródło
3
wydaje się, że nie dodaje to niczego istotnego w stosunku do punktów poczynionych i wyjaśnionych w poprzednich 11 odpowiedziach
gnat
Z szacunkiem się nie zgadzam, @gnat. Jest to pomocny przykład tego, jak można je wdrożyć. Ludzie uczą się lepiej dzięki przykładom. (Przyszedłem tutaj, aby sprawdzić, czy rozumiem, że wskaźnik może być agregacją, a obiekt - kompozycją. Jest to jedyna odpowiedź, która bezpośrednio to rozwiązuje.)
Bob Stein,