Programación Orientada a Objetos 7 - Asociaciones entre Clases

Uno de los temas fundamentales a entender en el mundo de la Programación Orientada a Objetos y el modelado de sistemas, es … ¿cómo los objetos se relacionan entre sí?  Las asociaciones entre objetos definen cómo las instancias de una clase se pueden vincular a instancias de otra clase.

En este capítulo vamos a ver los diferentes tipos de asociaciones, enfocándonos en la multiplicidad, composición y agregación.

Asociaciones entre Objetos: El Vínculo Fundamental

Una asociación es una conexión entre dos clases, indica que instancias de una clase pueden conocer o interactuar con instancias de otra clase.

Las asociaciones son la base sobre la cual se construyen relaciones más complejas.

En un diagrama de clases en UML, una asociación se representa como una línea que conecta dos clases. Opcionalmente, se pueden agregar etiquetas y flechas para aclarar la naturaleza de la relación.

Multiplicidad: Definiendo la Cantidad

La multiplicidad es un concepto que define cuántas instancias de una clase pueden estar asociadas con una instancia de otra clase.

Es una forma de expresar la cantidad y la naturaleza de las conexiones entre clases.

  • Notación: Se coloca cerca del extremo de la asociación y puede tomar varios valores como 1 (exactamente uno), 0..1 (ninguno o uno), * (cero o más), 1..* (uno o más), etc.

  • Importancia: La multiplicidad ayuda a entender las posibles interacciones entre objetos, como saber si un objeto puede existir sin estar asociado a otro.

Composición: Asociaciones Fuertes y Exclusivas

La composición es un tipo especial de asociación que representa una relación “contiene-a” o “parte-de” entre objetos. Indica que una instancia de una clase es una parte esencial e intrínsecamente vinculada a otra.

  • Características: Si el objeto contenedor (el todo) es destruido, todas sus partes también deben ser destruidas. La composición es una relación fuerte y exclusiva.

  • Notación en UML: Se representa con una línea que tiene un diamante negro en el extremo del contenedor.

Agregación: Asociaciones con Independencia

La agregación es similar a la composición en que representa una relación “parte-de“, pero es menos estricta. En la agregación, las partes pueden existir independientemente del todo.

  • Características: Si el objeto contenedor es destruido, las partes pueden continuar existiendo.

  • Notación en UML: Se representa con una línea que tiene un diamante blanco en el extremo del contenedor.

Ejemplo: Pedido, Cliente y Producto

Para entender cómo los objetos se vinculan en un sistema y cómo se aplican conceptos como asociación, multiplicidad, composición y agregación en un contexto real, vamos a modelar un sistema sencillo de e-commerce que incluye Pedido, Cliente y Producto.

Descripción del Sistema

  • Cliente: Representa a una persona que realiza pedidos. Un cliente puede realizar varios pedidos.
  • Pedido: Representa una orden realizada por un cliente. Un pedido puede incluir varios productos y está asociado a un único cliente.
  • Producto: Representa los artículos que el cliente puede ordenar. Un producto puede ser parte de varios pedidos.

Asociaciones y Multiplicidad

  • Cliente a Pedido: Un cliente puede realizar cero o muchos pedidos (multiplicidad 0..*), pero cada pedido está asociado con exactamente un cliente (multiplicidad 1).
  • Pedido a Producto: Un pedido puede contener uno o muchos productos (multiplicidad 1..*) y un producto puede ser parte de cero o muchos pedidos (multiplicidad 0..*).

Agregación y Composición

  • Composición (Pedido y Cliente): Aunque un pedido está muy asociado a un cliente, no es una parte esencial de un cliente. Un cliente puede existir sin un pedido. Por lo tanto, esta relación no es de composición.
  • Agregación (Pedido y Producto): Un pedido contiene productos, pero los productos pueden existir sin estar asociados con un pedido. Esto es una agregación, donde el pedido es un todo y los productos son las partes.

Diagrama UML

Así podríamos representar estas relaciones en UML:

asociaciones entre objetos

En este diagrama:

  • Clases: Representadas con rectángulos divididos en tres partes para el nombre de la clase, atributos y métodos.
  • Asociación Cliente-Pedido: Representada con una línea, la multiplicidad “0..*” cerca de Pedido indica que un cliente puede realizar cero o muchos pedidos. La multiplicidad “1” cerca de Cliente indica que cada pedido está asociado con un único cliente.
  • Agregación Pedido-Producto: Representada con una línea que tiene un diamante blanco en el extremo de Pedido. La multiplicidad “1..*cerca de Producto indica que un pedido puede contener uno o muchos productos. La multiplicidad “0..” cerca de Pedido indica que un producto puede ser parte de cero o muchos pedidos.

Conclusiones

Las asociaciones, multiplicidades, composiciones y agregaciones son herramientas fundamentales para modelar cómo los diferentes objetos y clases se relacionan y trabajan juntas.

Necesitamos entender estas herramientas porque son clave a la hora de diseñar sistemas, es un lenguaje común establecido en cualquier equipo de trabajo.