🧐 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.
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:
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.
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.
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 |