22. Diagramas de estructura compuesta: partes internas, puertos y conectores

22.1 Introducción

El diagrama de estructura compuesta es un diagrama UML de estructura que permite mostrar la organización interna de un clasificador, como una clase, un componente o un subsistema. Se enfoca en partes internas, puertos y conectores que explican cómo colaboran los elementos dentro de una unidad mayor.

No es uno de los diagramas UML más usados al comenzar, pero resulta útil cuando se necesita explicar la composición interna de un elemento complejo sin bajar al detalle completo de todas sus clases o implementaciones.

22.2 Qué representa este diagrama

Un diagrama de estructura compuesta representa cómo está formado internamente un elemento y cómo sus partes se conectan entre sí. A diferencia del diagrama de clases, que muestra tipos y relaciones generales, este diagrama puede mostrar roles internos dentro de una instancia compuesta.

Por ejemplo, un componente SistemaDeTurnos puede tener partes internas como gestorDeAgenda, validadorDisponibilidad y notificador. También puede tener puertos por donde recibe solicitudes o envía eventos.

Un diagrama de estructura compuesta responde: qué partes internas forman un elemento complejo y cómo colaboran entre ellas.

22.3 Partes internas, puertos y conectores

Las partes internas representan elementos que componen una unidad mayor. Los puertos indican puntos de interacción con el exterior. Los conectores muestran cómo se comunican las partes internas o cómo se conectan con los puertos. En conjunto, estos elementos permiten describir la estructura interna de una pieza compleja del sistema.

Diagrama de estructura compuesta UML con partes internas, puertos y conectores

22.4 Clasificador estructurado

Un clasificador estructurado es un elemento que puede tener estructura interna. Puede ser una clase, un componente o un subsistema. El diagrama muestra ese elemento como una caja mayor que contiene partes y conexiones.

Por ejemplo, un componente MotorDeReservas puede contener internamente un planificador, un validador y un repositorio. Esas partes colaboran para cumplir la responsabilidad general del componente.

22.5 Parte interna

Una parte interna representa un rol que un elemento cumple dentro del clasificador compuesto. Puede tener un nombre y un tipo, usando una notación similar a nombre:Tipo. Por ejemplo, validador:ValidadorDisponibilidad.

La parte no necesariamente representa una clase aislada en todo el sistema, sino el papel que ese tipo cumple dentro de la estructura compuesta.

22.6 Puerto

Un puerto es un punto de interacción entre el elemento compuesto y su entorno. Se dibuja como un pequeño cuadrado en el borde del clasificador. Puede estar asociado a interfaces ofrecidas o requeridas.

Por ejemplo, un componente ServicioDeTurnos puede tener un puerto API para recibir solicitudes de reserva y otro puerto Eventos para publicar notificaciones internas.

22.7 Puerto interno y externo

Un puerto en el borde del elemento compuesto indica una forma de comunicación con el exterior. También puede conectarse internamente con partes que procesan esas comunicaciones. Esto permite mostrar cómo una solicitud externa llega a una parte interna responsable.

Por ejemplo, el puerto de entrada de reservas puede conectarse con la parte controladorReservas, que luego se comunica con validadorDisponibilidad y gestorAgenda.

22.8 Conector

Un conector muestra una comunicación o relación entre partes internas, o entre una parte y un puerto. Puede indicar que una parte usa servicios de otra o que delega una comunicación recibida desde el exterior.

Los conectores ayudan a ver cómo circulan solicitudes o responsabilidades dentro del elemento compuesto. No deben dibujarse sin una razón clara.

22.9 Conector de ensamblaje

Un conector de ensamblaje une una interfaz requerida con una interfaz ofrecida. Se usa para mostrar que una parte necesita un servicio que otra parte proporciona.

Por ejemplo, un gestorDePedidos puede requerir una interfaz de pagos que es ofrecida por un procesadorDePagos. El conector muestra esa colaboración interna.

22.10 Conector de delegación

Un conector de delegación conecta un puerto externo del elemento compuesto con una parte interna. Indica que las solicitudes recibidas por el puerto se delegan a una parte interna que las atiende.

Por ejemplo, un puerto público de API puede delegar las solicitudes al controlador interno correspondiente.

22.11 Interfaces en estructura compuesta

Las interfaces pueden aparecer asociadas a puertos o conectores. Una interfaz ofrecida indica servicios disponibles. Una interfaz requerida indica servicios necesarios para que una parte funcione.

Este recurso permite mostrar contratos de comunicación sin detallar la implementación de cada parte interna.

22.12 Diferencia con diagrama de componentes

El diagrama de componentes muestra módulos de software y dependencias de alto nivel. El diagrama de estructura compuesta puede mostrar la organización interna de uno de esos módulos.

Por ejemplo, el diagrama de componentes puede mostrar Servicio de turnos como un componente. Un diagrama de estructura compuesta puede abrir ese componente y mostrar sus partes internas, puertos y conectores.

22.13 Diferencia con diagrama de clases

El diagrama de clases muestra clases y relaciones entre tipos. El diagrama de estructura compuesta muestra cómo se organizan partes internas dentro de un elemento compuesto. Puede usar tipos definidos en clases, pero su intención es explicar composición interna y colaboración.

Si solo se quiere mostrar tipos generales y asociaciones, conviene usar un diagrama de clases. Si se quiere mostrar la estructura interna de una unidad compleja, puede convenir estructura compuesta.

22.14 Ejemplo: servicio de turnos

Un ServicioDeTurnos puede tener un puerto para recibir solicitudes de reserva. Internamente, puede estar formado por partes como controladorTurnos, gestorAgenda, validadorDisponibilidad, repositorioTurnos y publicadorEventos.

El puerto de entrada delega la solicitud al controlador. El controlador usa el gestor de agenda. El gestor consulta el validador y el repositorio. Finalmente, el publicador de eventos informa que el turno fue reservado.

22.15 Ejemplo: sistema de pagos

Un componente SistemaDePagos puede incluir partes internas como validadorTarjeta, autorizadorPago, registradorTransacciones y adaptadorPasarelaExterna. Sus puertos pueden representar una API interna y una conexión hacia la pasarela externa.

Esta vista permite comprender cómo se organiza internamente el componente sin mostrar cada clase o método.

22.16 Cuándo usarlo

Conviene usar este diagrama cuando un elemento complejo necesita explicarse por dentro. Es útil para componentes con varias partes internas, módulos con puertos diferenciados, subsistemas que delegan responsabilidades o diseños donde las interfaces internas son relevantes.

No conviene usarlo si un diagrama de clases o de componentes ya comunica la idea con suficiente claridad. Es un diagrama más especializado y debe reservarse para casos donde aporte valor real.

22.17 Nivel de detalle

El nivel de detalle debe ser cuidadosamente elegido. Mostrar demasiadas partes internas puede convertir el diagrama en una implementación completa difícil de mantener. Mostrar muy pocas puede no aportar nada más que un diagrama de componentes.

Una buena práctica es enfocarse en las partes que explican la colaboración principal y omitir detalles secundarios.

22.18 Criterios de revisión

  • ¿El elemento modelado realmente tiene estructura interna relevante?
  • ¿Las partes internas tienen responsabilidades claras?
  • ¿Los puertos representan puntos de interacción significativos?
  • ¿Los conectores muestran colaboraciones necesarias?
  • ¿Se distingue comunicación externa de colaboración interna?
  • ¿El diagrama aporta más claridad que un diagrama de componentes o clases?
  • ¿El nivel de detalle se mantiene comprensible?

22.19 Errores frecuentes

  • Usar estructura compuesta cuando un diagrama de clases sería suficiente.
  • Mostrar demasiados detalles internos de implementación.
  • Dibujar puertos sin significado claro.
  • Agregar conectores que no representan comunicaciones reales.
  • Confundir partes internas con clases globales del sistema.
  • No diferenciar conectores de ensamblaje y delegación cuando la diferencia importa.
  • Crear un diagrama complejo para una estructura simple.

22.20 Qué debes recordar de este tema

  • El diagrama de estructura compuesta muestra la organización interna de un elemento complejo.
  • Las partes internas representan roles dentro del elemento compuesto.
  • Los puertos son puntos de interacción con el exterior.
  • Los conectores muestran comunicación o delegación entre partes y puertos.
  • Es un diagrama especializado, útil cuando la estructura interna debe explicarse.
  • No debe usarse si otro diagrama más simple comunica mejor la idea.

22.21 Conclusión

El diagrama de estructura compuesta permite abrir una clase, componente o subsistema para mostrar sus partes internas, puertos y conectores. Es útil cuando se necesita explicar cómo se organiza internamente una unidad compleja y cómo delega o coordina responsabilidades.

En el próximo tema veremos diagramas de tiempo y de vista global de interacción, y cuándo conviene usarlos.