Agregacja vs. Kompozycja w Programowaniu Obiektowym
W Programowaniu Obiektowym, istnieje wiele różnych typów relacji, które mogą istnieć pomiędzy dwoma lub więcej klasami. Najpopularniejsze dwa typy to:
- Dziedziczenie – relacja „jest”
- Asocjacja – relacja „ma”
Niniejszy blog będzie poświęcony dwóm typom relacji asocjacyjnych – Aggregacji i Kompozycji.
Asocjacja pomiędzy dwoma klasami jest relacją „ma”. Na przykład:
- A
CarposiadaEngineiWheel - A
PersonposiadaLegiArm - A
BookmaPages
To zwykle reprezentuje, gdy istnieją dwie klasy, ClassA i ClassB, i albo:
-
ClassAzawieraClassBjako atrybut, lub - Instancje
ClassBsą konstruowane wewnątrzClassA
Jaka jest różnica między Aggregation a Composition?
Istnieją dwa podtypy relacji asocjacyjnych – Aggregation i Composition. Jaka jest różnica między nimi?
Kompozycja
Kompozycja implikuje, że zawarta klasa nie może istnieć niezależnie od kontenera. Jeśli kontener zostanie zniszczony, dziecko również zostanie zniszczone.
Przykładem może być Page i BookPage nie może istnieć bez Book, ponieważ książka składa się z Pages. Jeśli Book zostanie zniszczony, Page również zostanie zniszczony.
W kodzie, zwykle odnosi się to do instancji dziecka tworzonej wewnątrz klasy kontenera:
class Book:
def __init__(self):
page1 = Page('This is content for page 1')
page2 = Page('This is content for page 2')
self.pages =
class Page:
def __init__(self, content):
self.content = contentbook = Book() # If I destroy this Book instance,
# the Page instances are also destroyed
Agregacja
Z agregacją, dziecko może istnieć niezależnie od rodzica.
Myśląc więc o Car i EngineEngine nie musi być zniszczony, gdy Car jest zniszczony.
class Car:
def __init__(self, engine):
self.engine = engine
class Engine:
def __init__(self):
passengine = Engine()
car = Car(engine) # If I destroy this Car instance,
# the Engine instance still exists
Jak są one reprezentowane diagram UML?
W diagramie UML, zarówno Aggregation, jak i Composition są reprezentowane za pomocą diamentowej strzałki między klasami. Końcówka diamentu znajduje się po stronie kontenera.
- Agregacja używa otwartego diamentu
- Kompozycja używa zamkniętego diamentu
Oto przykład:

Mam nadzieję, że to pomogło!