Un poco de UML… Agregación Vs Composición en diagramas de clases

Una duda que frecuentemente me plantean los alumnos a la hora de modelar diagramas de clases con UML (Unified Modeling Language), es el uso de las relaciones estructurales de agregación y composición. Se trata de dos tipos de especialización de la relación de asociación entre clases.

Vamos a intentar mediante algunos ejemplos muy simples y esclarecedores, ver las diferencias que existen entre la composición fuerte y la composición débil, conocida habitualmente como agregación.

Agregación

La agregación es un tipo de asociación que indica que una clase es parte de otra clase (composición débil). Los componentes pueden ser compartidos por varios compuestos (de la misma asociación de agregación o de varias asociaciones de agregación distintas). La destrucción del compuesto no conlleva la destrucción de los componentes. Habitualmente se da con mayor frecuencia que la composición.

La agregación se representa en UML mediante un diamante de color blanco colocado en el extremo en el que está la clase que representa el “todo”.

  • Veamos un ejemplo de agregación:agregacionTenemos una clase Empresa.
  • Tenemos una clase Cliente.
  • Una empresa agrupa a varios clientes.

Composición

Composición es una forma fuerte de composición donde la vida de la clase contenida debe coincidir con la vida de la clase contenedor. Los componentes constituyen una parte del objeto compuesto. De esta forma, los componentes no pueden ser compartidos por varios objetos compuestos. La supresión del objeto compuesto conlleva la supresión de los componentes.

El símbolo de composición es un diamante de color negro colocado en el extremo en el que está la clase que representa el “todo” (Compuesto).

Veamos un ejemplo de composición:

composicion

  • Tenemos una clase Empresa.
  • Un objeto Empresa está a su vez compuesto por uno o varios objetos del tipo empleado.
  • El tiempo de vida de los objetos Empleado depende del tiempo de vida de Empresa, ya que si no existe una Empresa no pueden existir sus empleados.

Diferencias entre Composición y Agregación

La siguiente tabla intenta resumir algunas diferencias entre agregación y composición.

Agregación Composición
Varias asociaciones comparten los componentes No
Destrucción de los componentes al destruir el compuesto No
Cardinalidad a nivel de compuesto Cualquiera 0..1 ó 1
Representación Rombo transparente Rombo negro

Y en código…

Para traducir ambas relaciones a código, podemos utilizar un atributo en la clase contenedora o compuesta donde almacenaremos una colección de los objetos que la componen, y por otro lado declararemos un método para agregar elementos a la colección. Dependiendo del lenguaje de programación empleado, podemos utilizar diferentes estructuras de datos que nos permitan almacenar esa colección de objetos, aunque generalmente se utilizan arrays (arreglos) para este fin.

Veamos un ejemplo:

agregacioncodigo

Como podemos apreciar, es tan simple como crear en la clase Empresa un atributo clientes (colección de clientes) que sea un array, luego creamos un método addCliente donde recibiremos objetos de tipo Cliente y los agregaremos dentro del array

Concluyendo…

En líneas generales, como hemos visto, se podría decir que la diferencia entre agregación y composición es conceptual, no se diferencia por código, o al menos, en el mayor de los casos y en la mayoría de los lenguajes de programación (como Java o PHP). De todas maneras, en el caso de la composición, si quisiéramos ser más estrictos con los diagramas de clases modelados con UML, deberíamos destruir de alguna manera el objeto componente (empleado) una vez que se desasociaran del objeto compuesto (empresa).

En definitiva, UML nos permite la posibilidad de diferenciar este tipo de asociaciones con el fin de que, aquella persona que le interese, pueda estipular de una u otra manera que se trata de una composición o una agregación, aunque en términos de implementación no se diferencie tan apenas su uso ni tenga tanta relevancia. Pero una vez más, y como vimos en un post anterior de este blog:“UML en su justa medida… , UML propone muchas posibilidades y debe ser el analista y/o desarrollador quien decida y haga un uso correcto del mismo, con el fin de visualizar, especificar, construir y documentar adecuadamente los artefactos (modelos) de un sistema software.

Todo esto y mucho más, se estudia en el curso de Experto en gestión y desarrollo de aplicaciones informáticas orientadas a objetos.

Etiquetas:, , ,

Acerca de José María Megino

Ingeniero Informático por la Universidad de Zaragoza y Máster Universitario en Formación de Profesorado de ESO y Bachillerato, FP y Enseñanza de Idiomas, Especialidad de Tecnología e Informática por la Universidad Internacional de La Rioja, Actualmente, Profesor Titular y Coordinador Docente en SEAS, Estudios Superiores Abiertos. (Grupo San Valero)

2 Respuestas a “Un poco de UML… Agregación Vs Composición en diagramas de clases”

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Salir /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s

A %d blogueros les gusta esto: