Aggregazione vs. Composizione nella programmazione orientata agli oggetti
Nella programmazione orientata agli oggetti, ci sono molti tipi diversi di relazioni che possono esistere tra due o più classi. I due tipi più comuni sono:
- Ereditarietà – una relazione “è una”
- Associazione – una relazione “ha una”
Questo blog farà un’immersione profonda nei due tipi di relazioni di associazione – aggregazione e composizione.
Una relazione di associazione tra due classi è una relazione “ha una”. Per esempio:
- Un
Car
ha unEngine
e unWheel
- Un
Person
ha unLeg
e unArm
- Un
Book
haPages
Questo solitamente rappresenta quando ci sono due classi, ClassA
e ClassB
, e o:
-
ClassA
contieneClassB
come attributo, oppure - Le istanze di
ClassB
sono costruite dentroClassA
Qual è la differenza tra aggregazione e composizione?
Ci sono due sottotipi di relazioni di associazione – Aggregazione e Composizione. Qual è la differenza tra questi due?
Composizione
La composizione implica che la classe contenuta non può esistere indipendentemente dal contenitore. Se il contenitore viene distrutto, anche il figlio viene distrutto.
Prendiamo per esempio un Page
e un Book
. Il Page
non può esistere senza il Book
, perché il libro è composto da Pages
. Se il Book
viene distrutto, anche il Page
viene distrutto.
Nel codice, questo di solito si riferisce all’istanza del figlio creato all’interno della classe contenitore:
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
Aggregazione
Con un’aggregazione, il figlio può esistere indipendentemente dal genitore.
Quindi, pensando a un Car
e un Engine
, il Engine
non ha bisogno di essere distrutto quando il Car
viene distrutto.
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
Come sono rappresentate in un diagramma UML?
In un diagramma UML, sia Aggregazione che Composizione sono rappresentate con una freccia a diamante tra le classi. L’estremità del diamante va sul lato del contenitore.
- Aggregazione usa un diamante aperto
- Composizione usa un diamante chiuso
Ecco un esempio:
Spero che sia stato utile!