En la programación orientada a objetos, un objeto se relaciona con otro para utilizar la funcionalidad y el servicio proporcionado por ese objeto. Esta relación entre dos objetos se conoce como asociación en el diseño de software general orientado a objetos y se representa mediante una flecha en el Lenguaje Unificado de Modelado o UML. Tanto la composición como la agregación son formas de asociación entre dos objetos, pero hay una sutil diferencia entre la composición y la agregación, que también se refleja en su notación UML. Nos referimos a la asociación entre dos objetos como Composición, cuando una clase es dueña de otras clases y las otras clases no pueden existir significativamente, cuando su dueño se destruye, por ejemplo, la clase Humano es una composición de varias partes del cuerpo incluyendo Mano, Pierna y Corazón. Cuando el objeto humano muere, todas las partes de su cuerpo dejan de existir de manera significativa, este es un ejemplo de Composición.
Los programadores a menudo confunden entre Asociación, Composición y Agregación en las discusiones de diseño orientado a objetos, esta confusión también hace que la diferencia entre Asociación, Composición y Agregación sea una de las preguntas populares en las Entrevistas de Java, sólo después de la diferencia entre clase abstracta e interfaz.
Otro ejemplo de Composición es el coche y sus partes, por ejemplo, motores, ruedas, etc. Las partes individuales del coche no pueden funcionar cuando el coche se destruye. Mientras que en el caso de la Agregación, incluyendo el objeto que puede existir sin ser parte del objeto principal como un Jugador que es parte de un Equipo, puede existir sin un equipo y puede llegar a ser parte de otros equipos también.
Otro ejemplo de Agregación es el Estudiante en la clase de Escuela cuando la Escuela cerró, el Estudiante todavía existe y entonces puede unirse a otra Escuela o así. En la notación UML, una composición se denota por un diamante relleno, mientras que la agregación se denota por un diamante vacío, lo que muestra su diferencia obvia en términos de fuerza de la relación.
La composición es más fuerte que la agregación. En resumen, una relación entre dos objetos se denomina asociación, y una asociación se conoce como composición cuando un objeto posee a otro mientras que una asociación se conoce como agregación cuando un objeto utiliza a otro.
En este tutorial de OOPS, veremos un par de ejemplos más para entender mejor la diferencia entre Asociación, Composición y Agregación.
Además, si eres nuevo en el mundo de la programación y el diseño orientado a objetos, te sugiero que sigas un curso práctico como UML y Fundamentos del Diseño Orientado a Objetos de Karloy Neisztor en Udemy. Es un gran curso para entender el proceso completo de análisis y diseño orientado a objetos para crear software de calidad.
Un ejemplo de asociación, composición y agregación en Java
Aquí tienes un ejemplo de composición y agregación, en términos de código Java. Mirando este código, puedes calibrar las diferencias entre estos dos. Por cierto, la Composición es también muy preferida en el diseño orientado a objetos sobre la herencia, incluso Joshua Bloch ha declarado su importancia en el libro clásico, Java Efectivo.
1. Composición:
Dado que Motor es parte de Carro, la relación entre ellos es Composición. He aquí cómo se implementan entre clases Java.
public class Car {
2. Agregación:
Dado que Organization tiene a Persona como empleados, la relación entre ellos es Aggregation. Así es como se ven en términos de clases Java
public class Organization { private List employees;}
public class Person { private String name; }
DiagramaUML de Asociación, Composición y Agregación
UML tiene diferentes notaciones para denotar agregación, composición y asociación. La asociación se denota con una flecha simple, mientras que la agregación se denota con una flecha vacía con cabeza de diamante y la composición se denota con una flecha con cabeza de diamante rellena.
Cuando se dibuja un diagrama UML para dos clases relacionadas A y B, donde A está asociada con B, entonces se denota con A -> B. Se utiliza una forma similar para mostrar la agregación y la composición entre dos clases.
Aquí están las notaciones UML para un tipo diferente de dependencia entre dos clases.
Asociación vs Composición vs Agregación
Aquí está la lista de diferencias entre Composición y Agregación en formato de puntos, para una rápida revisión. Como he dicho la diferencia clave entre ellos viene del punto que en el caso de la Composición, Un objeto es PROPIETARIO de otro objeto, mientras que en el caso de la agregación, un objeto es sólo un USUARIO o otro objeto.
1) Si A y B dos clases están relacionadas entre sí de tal manera que, B dejó de existir, cuando A se destruye, entonces la asociación entre dos objetos se conoce como Composición. Un ejemplo es Coche y Motor. Mientras que si A y B se asocian entre sí, de tal manera que B puede existir sin estar asociado con A, entonces esta asociación se conoce como Agregación.
Vea Head First Object-Oriented Analysis and Design para más ejemplos de Composición y Asociación en OOP.
2) En el caso de la Composición, A es dueño de B, por ejemplo, la Persona es dueña de su Mano, Mente y Corazón, mientras que en el caso de la Agregación, A utiliza a B, por ejemplo, la Organización utiliza a las Personas como empleados.
3) En el diagrama UML la Asociación se denota con una cabeza de flecha normal, mientras que la Composición se representa con una cabeza de flecha de diamante rellena, y la Agregación se representa con una cabeza de flecha de diamante vacía, Tal y como se muestra en el diagrama siguiente y adjunto en el tercer párrafo.
Asociación A—->B
Composición A—–<filled>B
Agregación A—–<>B
4) La agregación es una forma más ligera de la composición, en la que un objeto sub-parte puede existir significativamente sin objetos principales.
5) En Java, se puede utilizar la palabra clave final para representar la Composición. Dado que en la composición, el objeto propietario espera que un objeto parte esté disponible y funcione, al hacerlo final, se garantiza que, cuando se cree el propietario, este objeto parte existirá. Esto es en realidad un lenguaje de Java para representar una forma fuerte de asociación, es decir, la composición entre dos objetos.
6) Otra palabra interesante, que viene a la mano para entender la diferencia entre la composición y la agregación en el diseño de software es «parte-de» y «tiene». Si un objeto es parte de otro objeto, por ejemplo, el motor es parte del coche, entonces la asociación o relación entre ellos es la composición. Por otra parte, si un objeto sólo tiene otro objeto, por ejemplo, el coche tiene el conductor, entonces es la agregación. Dado que el análisis orientado a objetos es más sobre la definición de la relación entre el objeto, es importante saber qué tipo de relación existe entre ellos, la composición y la agregación es una dos formas de representar la relación entre dos objetos.
Aprendizaje adicional
Principios de diseño orientado a objetos
Introducción absoluta a la programación orientada a objetos en Java
Java – Programación orientada a objetos
Pequeños artículos más para mejorar tus habilidades de programación y diseño orientado a objetos
.programación orientada a objetos y habilidades de diseño
Los 10 mejores principios de diseño orientado a objetos que el programador de Java debe conocer
Por qué preferir la composición sobre la herencia en Java
Diferencia entre sobrecarga y anulación en Java
Las 10 mejores preguntas de la entrevista sobre la clase abstracta y la interfaz
20 preguntas sobre el patrón de diseño de Java y el diseño de software