Agregación vs. Composición en la Programación Orientada a Objetos
En la Programación Orientada a Objetos, hay muchos tipos diferentes de relaciones que pueden existir entre dos o más clases. Los dos tipos más comunes son:
- Herencia – una relación «es un»
- Asociación – una relación «tiene un»
- Un
Car
tiene unEngine
y unWheel
- Un
Person
tiene unLeg
y unArm
- Un
Book
tienePages
-
ClassA
contieneClassB
como atributo, o - Las instancias de
ClassB
se construyen dentro deClassA
Este blog va a hacer una inmersión profunda en los dos tipos de relaciones de Asociación – Agregación y Composición.
Una relación de asociación entre dos clases es una relación «tiene un». Por ejemplo:
Esto suele representar cuando hay dos clases, ClassA
y ClassB
, y cualquiera de ellas:
¿Cuál es la diferencia entre Agregación y Composición?
Hay dos subtipos de relaciones de Asociación – Agregación y Composición. ¿Cuál es la diferencia entre estos dos?
Composición
La composición implica que la clase contenida no puede existir independientemente del contenedor. Si el contenedor se destruye, el hijo también se destruye.
Toma como ejemplo un Page
y un Book
. El Page
no puede existir sin el Book
, porque el libro está compuesto por Pages
. Si el Book
se destruye, el Page
también se destruye.
En el código, esto suele referirse a que la instancia hija se crea dentro de la clase contenedora:
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
Agregación
Con una agregación, el hijo puede existir independientemente del padre.
Así que pensando en un Car
y un Engine
, el Engine
no necesita ser destruido cuando el Car
es destruido.
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
¿Cómo se representan en un diagrama UML?
En un diagrama UML, tanto la Agregación como la Composición se representan con una flecha de diamante entre las clases. El extremo del diamante va en el lado del contenedor.
- La Agregación utiliza un diamante abierto
- La Composición utiliza un diamante cerrado
Aquí tienes un ejemplo: