28 de marzo de 2019

Composición, Agregación y Asociación.

   Desde mi perspectiva, resulta no trivial el explicar la sutil diferencia que existe entre los conceptos de Composición, Agregación y Asociación. En mi experiencia, existe una tendencia muy común hacia utilizarlos de manera indistinta, sobre todo los dos primeros; por otro lado, el tratar de mostrar uno u otro tipo de relación con ejemplos aislados, en donde sólo me muestre la Composición pero no las otras dos y así con las otras combinaciones representa, al menos para mí, una tarea no muy sencilla.

   El siguiente diagrama de clases UML presenta los cuatro tipos de relaciones más comunes que se dan entre clases:
  1. Herencia (entre las clases Persona y Científico, estudiada en la entrada Herencia / Generalización).
  2. Composición (entre la clase Persona y las clases Pierna, Cabeza y Tórax entre otras tantas posibles).
  3. Agregación (entre las clases Persona y Ropa).
  4. Asociación (entre las clases Persona y Tarjeta de Crédito).
Diagrama de Clases UML para mostrar tres tipos de relaciones: Composición, Agregación y Asociación.

    Probablemente he abusado de la simplicidad para el ejemplo, pero he tratado de utilizar elementos conocidos y asequibles en lo general para evitar lo rebuscado o complejo que puede llegar a ser el modelado de un sistema más "real", en el que con toda seguridad aparecerán, de manera natural, este tipo de relaciones. Ahora bien, la generación de esta clase de diagramas se obtiene como resultado del análisis, la experiencia, y la previa comprensión de las diferencias (muchas veces sutiles e incluso subjetivas) que pretendo clarificar.

   La principal diferencia entre las relaciones radica fundamentalmente en dos cosas:

  1. En el tiempo de vida de los objetos que se deriven de las clases.
  2. El grado de dependencia o cohesión entre los objetos.
Herencia.
   Quizá la relación más simple y más común de las mostradas en el diagrama de clases anterior, sea la de la herencia: un Científico es una Persona, un Científico posee todas las características de una Persona (modeladas por sus atributos) más algunas características particulares a un Científico. Lo mismo sucede con sus responsabilidades y comportamiento. Para ampliar un poco más los detalles, puede el lector revisar la entrada Herencia / Generalización.

Composición.
   La Composición es un tipo de relación de alto grado de dependencia entre la clase contenedora (Persona) y las clases que la componen (Cabeza, Tórax, Pierna, etc.), es decir, cuando se crea una instancia de la clase contenedora, deben crearse, como parte de su conformación, instancias de los objetos que la componen, ya que no tendría sentido, desde el punto de vista de la instancia de Persona, conformar una persona sin cabeza o sin un tórax; por otro lado, durante toda la vida del objeto de la clase Persona debe existir el objeto de la clase Cabeza por la misma razón que antes. En este mismo sentido, tampoco tendría congruencia el tener una instancia de la clase Cabeza que nunca haya estado relacionada con una Persona.

   Algún lector inconforme podría argumentar que sí es posible que un objeto de la clase Persona deje de contener a uno de la clase Pierna por ejemplo, sin afectar la existencia de primero, y en efecto: es posible. Bastaría entonces con analizar si conviene más que la clase Pierna se modele mejor como Agregación, pero finalmente esto es sólo un ejemplo y la idea principal considero que ha sido plasmada, lo último sería más cuestión de análisis y de la conveniencia dada para un sistema determinado tal y como sucede en la vida real.

   Mi perspectiva y determinación personal sería: que se quedara como Composición.

Agregación.
   La Agregación, por otro lado, es un tipo de relación con un bajo grado de dependencia. Así por ejemplo, una instancia de la clase Persona, puede tener o no, durante su tiempo de vida (pero no es preciso que lo tenga desde su creación), un atributo de la clase Ropa sin que ello afecte su propia existencia; al mismo tiempo que un objeto de la clase Ropa podría existir independientemente de si es agregado a una Persona o a un Maniquí (clase que no aparece en el diagrama), por ejemplo.

   En este tipo de relación, la existencia de los objetos involucrados es independiente, lo mismo que su tiempo de vida: un objeto de la clase Ropa podría seguir existiendo más allá del tiempo de vida del de una Persona y viceversa, sin que ninguno de los dos se vea afectado.

Asociación.
   Una Asociación es aún menos dependiente en relación y tiempo. Espero que el lector coincida conmigo en que si bien la ropa no es imprescindible para la existencia de una persona, sí es necesaria; mientras que una tarjeta de crédito podría ser útil, en el mejor de los casos necesaria, pero en definitiva prescindible, es decir, una Persona podría pasar toda su vida sin tener la necesidad de ninguna Tarjeta de Crédito, mientras que otras podría tener muchas de ellas.

   Finalmente la relación de Asociación presentada en el diagrama, muestra que una Tarjeta de Crédito está asociada a una Persona, y que una Persona tiene ninguna (0) o varias (*) Tarjetas de Crédito.

    Finalmente, se recomienda revisar también la información expuesta en la entrada Consideraciones adicionales, en donde se presentan y contrastan ejemplos relacionados con lo aquí expuesto.

27 comentarios:

  1. Interesante, gracias por la explicación.

    ResponderBorrar
    Respuestas
    1. Me complace saber que la entrada le resultó de utilidad. Gracias a usted.

      Borrar
  2. Este comentario ha sido eliminado por el autor.

    ResponderBorrar
  3. muy buena la explicación, aunque me parece muy explicado el ejemplo de la pierna que quede como composición, ya que es subjetivo, ya que si se no atiende rapido la herida pues puede poner en peligro la existencia de una persona.

    ResponderBorrar
    Respuestas
    1. Sí, es subjetivo en efecto como el análisis y diseño de sistemas en lo general, también lo comento en la entrada. Gracias por la retroalimentación.

      Borrar
  4. Muchas gracias, clariiiiiiiiiiiiiiiito.

    ResponderBorrar
    Respuestas
    1. Agradezco el comentario y me complace que haya sido de utilidad.

      Borrar
  5. Me dio gracia los ejemplos, pero son excelentes gracias!!! c:

    ResponderBorrar
    Respuestas
    1. Celebro que además de útil, haya encontrado esparcimiento.
      Saludos.

      Borrar
  6. Siempre había tenido dudas respecto a estos 3 conceptos, gracias por la explicación y el excelente ejemplo que ha propuesto, despejo todas mis inquietudes.

    ResponderBorrar
  7. Me complace que te haya servido.
    Saludos.

    ResponderBorrar
  8. Muchas gracias, muy buenos los ejemplos. Suerte!

    ResponderBorrar
  9. Muchas gracias Ricardo, muy buena explicación! usted podrá ayudarme a realizar diagramas de clases de una página web estática? y de paso seguir aprendiendo...me avisa si lo puedo contactar por favor.

    ResponderBorrar
    Respuestas
    1. Agradezco el comentario. Respecto a su solicitud, estoy escaso de tiempo libre por mi trabajo y mis proyectos personales. Si sirve de algo, considero que los diagramas de clases son más para modelar entidades de un sistema que páginas web; diría que un diagrama de transición podría ser más útil para modelar las transiciones entre los vínculos, pero quizá no esté comprendiendo su problemática y desde ahí habríamos que empezar pero mi limitante es el tiempo, incluso el de ocio, que también me es preciado. Le deseo éxito.

      Borrar
  10. hola!, gracias por la explicacion. aun estoy en esto de desambiguar agregacion y asociacion. Si bien me estoy decantando por entender que en la agregacion se entiende que la clase contenedora esta "conformada" por las clases asociadas como partes. en la asociacion comun no se da esto de que una esta conformada por la otra si no que una tiene a la otra para su uso sin que esta la conforme como parte, pudiendo esto ser bilateral.
    sin embargo he encontrado definiciones de agragacion que me confunden, al decir que para que se determine que es agregacion se tiene que dar si o si la condicion de que la clase "todo" carezca de sentido sin la clase parte, o no pueda existir directamente por que no puede ser instanciada. crees que esta afirmacion es incorrecta? ya que a veces la dependencia de la clase todo no es literal, como en el caso de la ropa y la persona, claro que puede existir sin la ropa, pero puede ser necesaria para el funcionamiento correcto de la clase persona.

    ResponderBorrar