Agregación y Composición

Que significa la agregación y composición en la Programación Orientada a Objetos.

@doneberDev
7 noviembre 2020

🧐 Llega un momento en nuestras vidas en el que debemos aprender a usar la composición y la agregación. Bueno no, pero si es importante además de interesante en la POO.

Estos conceptos describen una relación de dependencia entre dos clases, lo que significa que la existencia de una afecta a la otra.

Para entrar en contexto, estamos hablando de objetos y clases de toda la vida, podrían tener en sus atributos un nombre o una edad, pero ahora imaginemos que tengan de atributos otros objetos (así es, objetos dentro de objetos 😱).

Composición 🎨

La composición implica dos roles: un todo y una parte. La parte es importante para el todo. En la composición, si la clase todo desaparece, la clase parte también debe desaparecer (consecuentemente). A este tipo de relación también se llama “relación fuerte”. 💪

En un diagrama de clases UML, se representa esta relación con una línea con un rombo pintado apuntando a la clase todo.

https://raw.githubusercontent.com/doneber/POO/master/Resources/relaciones/composicion.png

Esta relación se puede leer como ”B se compone de A” o ”A es parte de B”

Okay, ya hemos hablado suficiente de teoría. Veamos un ejemplo:

Ejemplo: Composición de un Smartphone 📱

Imaginemos que una clase Smartphone está compuesto de diferentes componentes, como su batería (que es una batería patentada). Podemos decir que un celular está compuesto de una batería y que si el celular desaparece, también desaparecerá la batería. De la misma forma, podemos ver que una batería no puede existir sin su celular. Entonces, aquí hay una relación de composición.

Si creamos clases para estos objetos, su relación se verá como en el siguiente diagrama de clases UML:

https://raw.githubusercontent.com/doneber/POO/master/Resources/POO/composicionExample.png

Ojo que la batería se crea al mismo tiempo que el smartphone, a través del constructor.

Agregación 🤝

En la agregación encontramos dos roles: el contenedor y el elemento. Con el tiempo, los elementos se agregan al contenedor. Si el contenedor desaparece, los elementos siguen existiendo. Esta relación también se la conoce como una relación débil, aquí uno no depende por completo del otro.

En un diagrama de clases, para mostrar que una clase es parte de otra, usamos una línea con un rombo vacío que apunta a la clase que la contiene.

https://raw.githubusercontent.com/doneber/POO/master/Resources/relaciones/agregacion.png

Esta relación se puede leer como ”B tiene A” o ”A esta en B”

Veamos un ejemplo.

Ejemplo: Agregación en un Smartphone 📱

Piensa en un celular. Al principio, no tiene ninguna tarjeta SIM (chip). Pero después puedes agregar una o incluso dos en los celulares nuevos.

https://raw.githubusercontent.com/doneber/POO/master/Resources/POO/agregacionExample.png

En agregación, necesitaremos un método para agregar un nuevo objeto En nuestro ejemplo, el método se llama agregarChip, ya que agregamos chips a nuestro celular.

Agregación vs Composición 💡

Aunque estas dos relaciones se parecen, hay diferencias importantes entre ellas:

Agregación Composición
Una clase no forma parte de la otra Una clase sí forma parte de la otra
Se inicializa vacía en su constructor Inicializa sus datos en el constructor
Tiene un método para agregar más elementos No se pueden agregar partes después de su creación
No se destruye cuando lo hace la clase contenedora Se destruye cuando lo hace la clase principal
Puede vivir independientemente Vive dentro de la otra clase