El diagrama de componentes es un diagrama UML de estructura que muestra partes de software, interfaces y dependencias entre ellas. Es útil para representar una vista de arquitectura o diseño de alto nivel, donde interesa comprender cómo se divide una solución en módulos y cómo esos módulos se comunican.
Mientras un diagrama de clases suele mostrar tipos y relaciones más detalladas, el diagrama de componentes trabaja con bloques mayores: aplicaciones, servicios, bibliotecas, módulos, APIs, subsistemas o partes desplegables.
Un componente representa una unidad modular de software. Puede ofrecer interfaces, requerir servicios de otros componentes y encapsular una parte de la implementación. El componente se piensa como una pieza que cumple una responsabilidad clara dentro de la solución.
Por ejemplo, en un sistema de ventas pueden existir componentes como Aplicación web, Servicio de pedidos, Servicio de pagos, Servicio de inventario, Base de datos y Cliente de notificaciones.
Un diagrama de componentes permite observar qué módulos forman el sistema, qué interfaces ofrecen, qué interfaces requieren y qué dependencias existen entre ellos. Esta vista ayuda a discutir arquitectura sin entrar en cada clase interna.
Una interfaz ofrecida representa un conjunto de servicios que un componente pone a disposición de otros. En UML puede dibujarse con el símbolo de círculo, también llamado lollipop, conectado al componente.
Por ejemplo, un Servicio de pagos puede ofrecer una interfaz ProcesamientoPago, con operaciones para autorizar, confirmar o cancelar pagos. Otros componentes pueden usar esa interfaz sin conocer todos los detalles internos del servicio.
Una interfaz requerida representa un servicio que un componente necesita de otro para funcionar. En UML puede representarse con una forma de semicírculo o socket.
Por ejemplo, un Servicio de pedidos puede requerir una interfaz de Pagos para confirmar cobros y una interfaz de Inventario para verificar stock. Esto permite ver dependencias necesarias sin mostrar implementación interna.
Una dependencia indica que un componente necesita a otro. Puede representarse con una flecha discontinua o mediante interfaces ofrecidas y requeridas. La dirección de la dependencia debe mostrar quién necesita a quién.
Las dependencias son importantes porque indican impacto de cambios. Si un componente cambia su interfaz, todos los componentes que dependen de ella pueden verse afectados.
Un puerto representa un punto de interacción de un componente con su entorno. Puede usarse para indicar por dónde entran o salen comunicaciones específicas. Es útil cuando un componente tiene varias formas de comunicación o varias interfaces agrupadas.
Por ejemplo, un componente Aplicación móvil puede tener un puerto para API pública y otro para sincronización. No siempre es necesario mostrar puertos; se usan cuando aclaran la arquitectura.
Un componente representa una unidad lógica de software. Un artefacto representa un elemento físico o generado, como un archivo ejecutable, una biblioteca, un paquete, una imagen de contenedor o un archivo de configuración.
En algunos modelos, un componente puede manifestarse en uno o varios artefactos. Por ejemplo, el componente Servicio de pedidos puede desplegarse como un archivo ejecutable, una imagen de contenedor o un paquete de aplicación.
Un componente puede contener muchas clases. El diagrama de componentes no pretende mostrar el detalle interno de cada clase, sino la organización modular de mayor nivel. Para ver clases internas, se puede usar un diagrama de clases separado.
Por ejemplo, el componente Servicio de turnos puede contener clases como Turno, Agenda, ServicioTurnos, RepositorioTurnos y ValidadorDisponibilidad. El diagrama de componentes solo necesita mostrar que existe ese módulo y qué dependencias tiene.
Los paquetes organizan elementos del modelo; los componentes representan partes modulares de software. A veces ambos conceptos parecen similares, pero no tienen el mismo propósito. Un paquete agrupa; un componente ofrece o requiere servicios y puede ser una unidad de implementación o despliegue.
En un modelo de arquitectura, puede haber correspondencia entre paquetes y componentes, pero conviene no tratarlos como sinónimos sin analizar la intención.
Un diagrama de componentes puede representar una arquitectura por capas. Por ejemplo, Interfaz de usuario, Aplicación, Dominio, Infraestructura y Base de datos. Las dependencias deberían seguir una dirección controlada.
Esta vista ayuda a detectar dependencias incorrectas. Si Dominio depende de Interfaz de usuario, puede existir una violación de separación de responsabilidades.
En sistemas modernos, los componentes suelen representar servicios o APIs. Un Servicio de usuarios puede ofrecer operaciones de autenticación y consulta de perfiles. Un Servicio de pagos puede ofrecer autorización y confirmación de cobros.
El diagrama de componentes permite mostrar estas integraciones sin entrar en detalles de endpoints, parámetros o protocolos específicos, salvo que sean necesarios para la comprensión.
Los sistemas externos también pueden representarse como componentes cuando participan en la arquitectura. Por ejemplo, una pasarela de pagos, un proveedor de correo, un sistema contable o un servicio de identidad.
Representarlos ayuda a visualizar dependencias fuera del sistema propio y a discutir riesgos, disponibilidad, seguridad e integración.
Un sistema de turnos médicos puede tener componentes como Aplicación web, Servicio de turnos, Servicio de usuarios, Servicio de notificaciones, Base de datos y API de calendario. El Servicio de turnos puede requerir servicios de usuarios para identificar pacientes y servicios de notificaciones para enviar recordatorios.
Esta vista permite comprender la organización modular sin mostrar todos los detalles internos de clases y métodos.
Una tienda en línea puede incluir componentes como Frontend, API de catálogo, Servicio de pedidos, Servicio de pagos, Servicio de inventario, Servicio de envíos y Base de datos. El Servicio de pedidos puede depender de pagos, inventario y envíos.
El diagrama ayuda a revisar si las dependencias son razonables y si cada componente tiene una responsabilidad clara.
Conviene usar diagramas de componentes cuando se necesita explicar arquitectura modular, dependencias entre servicios, interfaces ofrecidas y requeridas, integración con sistemas externos o división de una solución en partes reemplazables.
No son necesarios para describir detalles internos de una clase, el flujo de un proceso o el orden de mensajes de un escenario. Para eso existen otros diagramas UML.
Un diagrama de componentes puede ser muy general o bastante técnico. En una vista general, puede mostrar aplicaciones y servicios principales. En una vista técnica, puede incluir interfaces, puertos, artefactos y dependencias específicas.
El nivel de detalle debe responder a la pregunta del diagrama. Si se busca comunicar arquitectura a alto nivel, conviene evitar saturar la vista con detalles internos.
El diagrama de componentes permite representar la estructura modular de una solución de software. Ayuda a comprender qué partes existen, qué interfaces ofrecen, qué servicios requieren y cómo se conectan con otros componentes o sistemas externos.
En el próximo tema veremos diagramas de despliegue, orientados a nodos, dispositivos, servidores y artefactos.