ProgramaciónDesarrollador Backend

¿Qué son la composición y la agregación en la programación orientada a objetos en Python, en qué se diferencian y dónde se utilizan?

Supere entrevistas con el asistente de IA Hintsage

Respuesta.

Historia de la pregunta:

Ambos términos — composición y agregación — provienen del diseño orientado a objetos clásico. Describen las relaciones entre objetos: "todo-parte", pero se diferencian por el grado de conexión entre los objetos.

Problema:

En sistemas grandes, la legibilidad y la escalabilidad del código son importantes. La composición y la agregación ayudan a establecer dependencias claras entre las clases. Es importante entender la diferencia; de lo contrario, se puede hacer una arquitectura demasiado rígida o, por el contrario, difusa.

Solución:

Composición — es una fuerte conexión "parte-todo". Cuando un objeto está contenido solo dentro de otro objeto y no puede existir fuera de él. En Python, este tipo de objeto generalmente se crea y se gestiona dentro de la clase "contenedor".

Agregación — es una conexión más débil. El objeto "parte" puede existir por separado del objeto "todo" y ser pasado a él desde el exterior.

Ejemplo de código:

class Engine: def start(self): print("Engine started") class Car: # Composición: creamos Engine dentro de Car def __init__(self): self.engine = Engine() def drive(self): self.engine.start() my_car = Car() my_car.drive() class Wheel: pass class Bicycle: # Agregación: las ruedas se pasan desde el exterior def __init__(self, wheels): self.wheels = wheels w1, w2 = Wheel(), Wheel() bike = Bicycle([w1, w2])

Características clave:

  • La composición proporciona un control total sobre el ciclo de vida del objeto anidado.
  • La agregación ofrece una arquitectura más flexible y conexiones débiles.
  • A través de la composición es fácil implementar el patrón "tiene-un", y a través de la agregación — compartir objetos.

Preguntas capciosas.

¿Si se elimina el objeto "contenedor" (por ejemplo, Car), ¿se eliminará el objeto Engine?

En la composición, si no hay más referencias al objeto "parte", será eliminado por el recolector de basura. En la agregación, el objeto "parte" puede continuar existiendo (puede ser referenciado por otros objetos).

¿En Python hay una sintaxis especial para la agregación y composición, como en otros lenguajes?

En Python no hay palabras clave que indiquen explícitamente composición/agregación. Todo depende de cómo se crean y manejan los ciclos de vida de los objetos.

¿Se puede cambiar la composición por agregación y viceversa sin reescribir la lógica?

No siempre. Si la lógica requiere control total y unicidad del objeto "parte", un simple cambio de composición a agregación puede causar errores (por ejemplo, si las ruedas de diferentes bicicletas se convierten en instancias compartidas de una sola clase).

Errores típicos y antipatrón

Ventajas:

  • La composición tiene un control claro sobre la construcción y destrucción de objetos.
  • La agregación permite flexibilidad y reutilización de objetos. Desventajas:
  • La composición puede llevar a conexiones demasiado estrechas.
  • La agregación a veces permite errores lógicos debido a la "división de propiedad" de los objetos.

Ejemplo de la vida real

Caso negativo: En un proyecto, se creaba un objeto externo de motor para cada automóvil y se pasaba al coche a través de agregación. Sin embargo, luego se confundieron las referencias a los objetos y se cambiaron los motores entre los coches de manera arbitraria — lo que llevó a confusiones y errores.

Ventajas: la arquitectura parecía flexible. Desventajas: era difícil entender qué motor pertenecía a qué coche.

Caso positivo: En otro proyecto, los motores se creaban dentro de la clase Car (composición); los automóviles controlaban sus motores directamente, lo que aseguraba fiabilidad.

Ventajas: ausencia de fugas y confusiones lógicas. Desventajas: se tuvo que escribir un poco más de código para gestionar el ciclo de vida de cada automóvil y sus detalles.