Articles

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 un Engine e un Wheel
  • Un Person ha un Leg e un Arm
  • Un Book ha Pages

Questo solitamente rappresenta quando ci sono due classi, ClassA e ClassB, e o:

  • ClassA contiene ClassB come attributo, oppure
  • Le istanze di ClassB sono costruite dentro ClassA

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!

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *