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
Car
posiadaEngine
iWheel
- A
Person
posiadaLeg
iArm
- A
Book
maPages
To zwykle reprezentuje, gdy istnieją dwie klasy, ClassA
i ClassB
, i albo:
-
ClassA
zawieraClassB
jako atrybut, lub - Instancje
ClassB
są 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 Book
Page
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 Engine
Engine
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!