Articles

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»
  • 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:

    • Un Car tiene un Engine y un Wheel
    • Un Person tiene un Leg y un Arm
    • Un Book tiene Pages
    • Esto suele representar cuando hay dos clases, ClassA y ClassB, y cualquiera de ellas:

      • ClassA contiene ClassB como atributo, o
      • Las instancias de ClassB se construyen dentro de ClassA
        • ¿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:

¡Espero que esto te haya ayudado!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *