Nie rozumiem niektórych zapisów diagramów klas UML.
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.
źródło
Odpowiedzi:
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.
źródło
Kompozycja ma miejsce, gdy
object A
zawieraobject B
iobject A
jest również odpowiedzialna za tworzenie plikuobject B
.Relacja składu
Mamy klasę A, która będzie używana przez klasę B.
Istnieje wiele opcji, takich jak wygląd kompozycji.
Skład bezpośredniej inicjalizacji:
Kompozycja inicjalizacji konstruktora
Leniwa kompozycja inicjalizacyjna
Widzisz, tworzy to ścisły związek między klasami
A
iB
. KlasaB
po prostu nie może istnieć bezA
. Jest to ogromne naruszenie zasady wstrzykiwania zależności , która mówi:Kompozycja czasami ma sens, na przykład wywoływanie
new DateTime
w php lubnew std::vector<int>
w C ++. Ale najczęściej jest to ostrzeżenie, że Twój projekt kodu jest nieprawidłowy.W przypadku, gdy
class A
byłby to specjalny obiekt używany do buforowania,class B
zawsze byłby buforowany przy użyciu implementacjiclass A
i 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 A
nie powiedzie, twojaobject B
nagle stanie się bezużyteczna.Z drugiej strony agregacja jest sposobem relacji, który jest zgodny z zasadą DI .
object B
musi użyćobject A
, to powinieneś przekazać już utworzoną instancjęobject A
doobject B
, a jeśli tworzenie sięobject A
nie 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 B
nie może istnieć bezobject A
).Looser (możesz lub nie możesz używać w
object A
środkuobject B
, ale jeśli to zrobisz, prawdopodobnie powinieneś go najpierw ustawić).Za pomocą setera:
Za pośrednictwem własności publicznej:
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.
źródło
Dodatkowo fragment aktualnego standardu UML:
11.5.4 Powiązania - Semantyka - Notacja
9.5.4 Klasyfikacja - Właściwości - Notacja
źródło
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.
źródło