Notacje diagramów klas UML: Różnice między skojarzeniem, agregacją i kompozycją

39

Nie rozumiem niektórych zapisów diagramów klas UML.

wprowadź opis zdjęcia tutaj

Jestem pewien, że wiem, co znaczy Stowarzyszenie . Każda relacja między instancjami dwóch klas, w której instancja jednej klasy musi wiedzieć o instancji drugiej klasy, aby wykonać swoją pracę - jest relacją stowarzyszenia. Skojarzenie często oznacza, że ​​klasa A ma odniesienie (pole) do wystąpienia klasy B.

Mam jednak problem ze zrozumieniem, co oznaczają strzałki agregacji i kompozycji . Część mojego zamieszania spowodowana była spotkaniem różnych definicji tych zapisów.

Dwie definicje zapisu agregacyjnego :

Definicja 1: Notacja Agregacja między dwiema klasami jest odpowiednia, gdy instancja klasy A zawiera zbiór instancji klasy B (np. Lista, Tablica, cokolwiek).

Definicja 2: Łącze agregacji między dwiema klasami jest odpowiednie, jeśli instancja klasy A zawiera odwołanie do instancji klasy B, a instancja B jest zależna od cyklu życia instancji A. Znaczenie: Gdy instancja klasy A zostanie usunięta, podobnie jak instancja klasy B. Instancja klasy B jest całkowicie objęta przez instancję klasy A, w przeciwieństwie do instancji klasy A, która jest po prostu właścicielem odwołania do instancji klasy klasa B (która jest normalnym stowarzyszeniem).

Co do tego, co oznacza notacja składu i czym różni się od notacji agregacji, nie jestem pewien.

Proszę wyjaśnić definicje i pomóc mi zrozumieć. Konkretne przykłady byłyby mile widziane.

Aviv Cohn
źródło
Definicja 2 brzmi bardziej jak definicja Kompozycji niż Agregacja. Definicja 1 brzmi całkiem dobrze.
jbx 10.10.15

Odpowiedzi:

32

Trzy ogniwa: Stowarzyszenie, Agregacja i Kompozycja tworzą rodzaj skali tego, jak blisko dwie klasy są ze sobą powiązane.

Na jednym końcu skali znajduje się skojarzenie, w którym obiekty obu klas mogą się o sobie wiedzieć, ale nie wpływają na siebie nawzajem przez całe życie. Obiekty mogą istnieć niezależnie i który obiekt klasy A wie, które obiekty klasy B mogą się zmieniać w czasie.

Na drugim końcu skali znajduje się Kompozycja. Kompozycja reprezentuje relację część - całość, tak że klasa B jest integralną częścią klasy A. Zależność ta jest zwykle stosowana, jeśli obiekty klasy A nie mogą istnieć logicznie bez obiektu klasy B.

Relacja agregacji znajduje się gdzieś pomiędzy tymi dwoma końcami, ale wydaje się, że nikt nie zgadza się, gdzie dokładnie, więc nie ma też powszechnie uzgodnionej definicji tego, co oznacza agregacja. W tym sensie obie znalezione definicje są poprawne i jeśli zapytasz 10 osób, ryzykujesz otrzymaniem 11 różnych definicji.

Bart van Ingen Schenau
źródło
1
Dzięki za odpowiedź. Oto jak rozumiem różne rzeczy. Powiedz, czy to rozsądna definicja. 1- Skojarzenie występuje, gdy obiekt A musi wiedzieć o obiekcie B, aby wykonać swoją funkcjonalność. 2- Zarówno agregacja, jak i kompozycja definiują relację „własności” - instancja klasy A jest koncepcyjnie właścicielem instancji klasy B. Jednak okres istnienia instancji B jest niezależny od okresu istnienia instancji A. Na przykład dział z pracownikami. Departament „jest właścicielem” instance pracownika, ale będzie żył bez niego. Skład jest podobny do agregacji, ale
Aviv Cohn
1
czas życia instancji B zależy od czasu życia instancji A. Silniejsza relacja „własności”. Na przykład: samochód i koło. Samochód „w całości zawiera” koło. Instancja Koła nie będzie istnieć bez instancji Samochodu ją zawierającej. Czy to rozsądne zróżnicowanie?
Aviv Cohn,
@Prog: Tak, to rozsądna definicja. Pamiętaj tylko, że inni mogą nie dzielić się tą definicją i że może być konieczne wyjaśnienie im zastosowania agregacji.
Bart van Ingen Schenau
Co powiesz na najczęstszą definicję notacji agregacyjnej? Definicji, której używam? Definicja „ma zbiór”? Coś innego?
Aviv Cohn,
Odniesienie do poniższej normy OMG jest pouczające. Stowarzyszenie i skład są dość proste. Agregacja jest chwiejna. W praktyce uważam, że „część” testu działa dobrze („własność” to nieoptymalny sposób myślenia o tym). Osoba może należeć do klubu, dlatego klub gromadzi ludzi (nie jest ich właścicielem). Po zniszczeniu klubu ludzie nadal istnieją.
Huliax
10

Kompozycja ma miejsce, gdy object Azawiera object Bi object Ajest również odpowiedzialna za tworzenie pliku object B.

Relacja składu

Mamy klasę A, która będzie używana przez klasę B.

final class A
{
}

Istnieje wiele opcji, takich jak wygląd kompozycji.

Skład bezpośredniej inicjalizacji:

final class B
{
    private $a = new A();
}

Kompozycja inicjalizacji konstruktora

final class B
{
    private $a;

    public function __construct()
    {
        $this->a = new A();
    }
}

Leniwa kompozycja inicjalizacyjna

final class B
{
    private $a = null;

    public function useA()
    {
        if ($this->a === null) {
            $this->a = new A();
        }

        /* Use $this->a */
    }
}

Widzisz, tworzy to ścisły związek między klasami Ai B. Klasa Bpo prostu nie może istnieć bez A. Jest to ogromne naruszenie zasady wstrzykiwania zależności , która mówi:

Zależność to obiekt, z którego można korzystać (usługa). Zastrzyk to przekazanie zależności do obiektu zależnego (klienta), który go użyje. Usługa jest częścią stanu klienta. Podstawowym wymaganiem wzorca jest przekazanie usługi klientowi, zamiast umożliwienia klientowi zbudowania lub znalezienia usługi.

Kompozycja czasami ma sens, na przykład wywoływanie new DateTimew php lub new std::vector<int>w C ++. Ale najczęściej jest to ostrzeżenie, że Twój projekt kodu jest nieprawidłowy.

W przypadku, gdy class Abyłby to specjalny obiekt używany do buforowania, class Bzawsze byłby buforowany przy użyciu implementacji class Ai nie miałbyś żadnej kontroli, aby dynamicznie go zmieniać, co jest złe.

Ponadto, jeśli użyjesz leniwej kompozycji inicjalizacyjnej , co oznacza, że ​​będziesz miał działającą metodę object B, zwaną useA()metodą, a tworzenie się object Anie powiedzie, twoja object Bnagle stanie się bezużyteczna.


Z drugiej strony agregacja jest sposobem relacji, który jest zgodny z zasadą DI . object Bmusi użyć object A, to powinieneś przekazać już utworzoną instancję object Ado object B, a jeśli tworzenie się object Anie powiedzie, nic nie zostanie przekazane w pierwszej kolejności.

W skrócie, Agregacja jest reprezentacją UML dla zasady wstrzykiwania zależności , czy to wstrzykiwania do konstruktora, wstrzykiwania setera czy wstrzykiwania własności publicznej.

To są wszystkie agregacje

Najściślejszy wtrysk konstruktora ( object Bnie może istnieć bez object A).

final class B
{
    private $a;

    public function __construct(A $a)
    {
        $this->a = $a;
    }
}

Looser (możesz lub nie możesz używać w object Aśrodku object B, ale jeśli to zrobisz, prawdopodobnie powinieneś go najpierw ustawić).

Za pomocą setera:

final class B
{
    private $a;

    public function setA(A $a)
    {
        $this->a = $a;
    }
}

Za pośrednictwem własności publicznej:

final class B
{
    public $a;
}

Nie ma naprawdę świetnego sposobu na uzasadnienie użycia Agregacji zamiast Kompozycji, jeśli wszystko, czego używasz, to konkretne implementacje klas, ale kiedy zaczniesz wstrzykiwać interfejsy lub w przypadku klas abstrakcyjnych C ++, nagle Agregacja będzie jedynym sposobem na wypełnij swój kontrakt.

Andy
źródło
1
Przeglądanie przykładów kodu naprawdę pomaga! Wszystkie objaśnienia w języku angielskim bez kodu wydają się tak niejasne i subiektywne.
Niko Bellic,
1

Dodatkowo fragment aktualnego standardu UML:

11.5.4 Powiązania - Semantyka - Notacja

[...] Stowarzyszenie binarne może mieć jeden koniec z agregacją = AggregationKind :: shared lub agregation = AggregationKind :: composite. Gdy na jednym końcu znajduje się agregacja = AggregationKind :: shared, dodaje się wydrążony diament jako ozdobę końcową na końcu linii asocjacji naprzeciwko końca oznaczonego agregacją = AggregationKind :: shared. Diament powinien być zauważalnie mniejszy niż notacja diamentowa dla Stowarzyszeń. Skojarzenie z agregacją = AggregationKind :: kompozyt podobnie ma diament na odpowiednim końcu, ale różni się wypełnieniem diamentem . […]

9.5.4 Klasyfikacja - Właściwości - Notacja

[…] Czasami Właściwość jest używana do modelowania okoliczności, w których jedna instancja jest używana do grupowania zestawu instancji; nazywa się to agregacją. Aby przedstawić takie okoliczności, właściwość ma właściwość agregacji typu AggregationKind; instancja reprezentująca całą grupę jest klasyfikowana przez właściciela właściwości, a instancje reprezentujące zgrupowane osoby są klasyfikowane według typu właściwości. AggregationKind jest wyliczeniem o następujących wartościach literalnych:

  • none : wskazuje, że właściwość nie ma semantyki agregacji.
  • Współużytkowane : wskazuje, że właściwość ma wspólną semantykę agregacji. Dokładna semantyka współużytkowanej agregacji różni się w zależności od obszaru zastosowania i modelarza.
  • Złożony : wskazuje, że właściwość jest agregowana złożona, tj. Obiekt złożony jest odpowiedzialny za istnienie i przechowywanie złożonych obiektów (patrz definicja części w 11.2.3). Agregacja złożona jest silną formą agregacji, która wymaga, aby obiekt części był zawarty maksymalnie w jednym obiekcie złożonym na raz. Jeśli obiekt złożony zostanie usunięty, wszystkie jego instancje części, które są obiektami, zostaną z nim usunięte.

[…]

ManuelSchneid3r
źródło
0

Już opublikowałem odpowiedź na Stackoverflow .

Zasadniczo agregacja jest silniejsza niż zwykłe skojarzenie, ale zagregowane obiekty mogą „żyć” bez siebie, tak jak w przypadku zwykłego skojarzenia.

Kompozycja jest nawet silniejsza niż agregacja, ponieważ zagregowana klasa nie może być agregowana przez inne klasy. Jego „żywotność” zależy od pojemnika.

C. szampan
źródło