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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.