11. Diagramas de paquetes: organización de modelos y dependencias entre módulos

11.1 Introducción

El diagrama de paquetes es un diagrama UML de estructura que permite organizar elementos del modelo en grupos. Un paquete puede agrupar clases, casos de uso, componentes, interfaces u otros paquetes. Su objetivo principal es reducir complejidad y mostrar dependencias entre partes del sistema.

Cuando un modelo crece, mirar todos los elementos al mismo tiempo se vuelve difícil. Los paquetes permiten trabajar con una vista de mayor nivel: en lugar de observar decenas de clases, se pueden observar áreas, capas, módulos o subsistemas y las relaciones entre ellos.

11.2 Qué es un paquete

Un paquete es un contenedor lógico. Sirve para agrupar elementos relacionados por función, capa, responsabilidad, módulo, área del negocio o criterio arquitectónico. En UML se representa con una forma similar a una carpeta con pestaña.

Por ejemplo, en un sistema de ventas pueden existir paquetes como Usuarios, Catálogo, Pedidos, Pagos y Facturación. En una arquitectura por capas pueden existir paquetes como Presentación, Aplicación, Dominio e Infraestructura.

Un paquete organiza elementos del modelo para que la estructura general del sistema sea más comprensible.

11.3 Organización mediante paquetes

Los paquetes permiten observar un sistema desde una vista más general. En lugar de mostrar cada clase, el diagrama puede mostrar grupos de elementos y dependencias entre ellos. Esto ayuda a entender qué partes existen, cómo se conectan y dónde puede haber acoplamiento excesivo.

Diagrama de paquetes UML con módulos y dependencias entre partes del sistema

11.4 Para qué sirve un diagrama de paquetes

Un diagrama de paquetes sirve para comprender la organización global de un modelo o sistema. Es útil cuando se necesita explicar módulos, capas, áreas funcionales, dependencias principales o separación de responsabilidades.

También ayuda a detectar problemas de arquitectura. Si todos los paquetes dependen de todos, el sistema puede estar demasiado acoplado. Si un paquete de interfaz depende directamente de detalles internos de base de datos, puede existir una ruptura de capas.

11.5 Contenido de un paquete

Un paquete puede contener diferentes elementos UML. Puede agrupar clases relacionadas, casos de uso de una misma área, componentes de una solución, interfaces o incluso otros paquetes. El contenido depende del propósito del diagrama.

No siempre es necesario mostrar lo que hay dentro del paquete. Muchas veces alcanza con mostrar el nombre del paquete y sus dependencias. Si se necesita más detalle, se puede crear otro diagrama centrado en el contenido interno.

11.6 Dependencias entre paquetes

Una dependencia entre paquetes indica que elementos de un paquete usan, conocen o necesitan elementos de otro. Se representa normalmente con una línea discontinua y una flecha hacia el paquete del cual se depende.

Por ejemplo, el paquete Pedidos puede depender de Pagos si necesita confirmar cobros. El paquete Aplicación puede depender de Dominio si usa entidades y reglas del negocio. La dirección de la flecha debe expresar quién necesita a quién.

11.7 Dirección de las dependencias

La dirección de una dependencia es importante. Si el paquete A depende del paquete B, significa que cambios en B pueden afectar a A. Por eso, el diagrama de paquetes puede revelar riesgos de mantenimiento y acoplamiento.

En una arquitectura por capas, suele esperarse que las dependencias sigan una dirección controlada. Por ejemplo, la capa de presentación puede depender de la capa de aplicación, pero no conviene que la capa de dominio dependa de detalles de presentación.

11.8 Paquetes por áreas funcionales

Una forma común de organizar paquetes es por áreas funcionales. En un sistema de ventas, podrían existir paquetes como Clientes, Productos, Pedidos, Pagos, Envíos y Facturación. Esta organización refleja partes del negocio o funciones principales del sistema.

Es útil cuando se quiere explicar el alcance funcional y las dependencias entre áreas. Por ejemplo, Pedidos puede depender de Productos para conocer información del catálogo y de Pagos para confirmar una operación.

11.9 Paquetes por capas

Otra forma frecuente es organizar paquetes por capas. Por ejemplo: Presentación, Aplicación, Dominio e Infraestructura. Cada capa tiene responsabilidades diferentes.

Presentación se ocupa de la interacción con usuarios o sistemas externos. Aplicación coordina casos de uso. Dominio concentra reglas y conceptos principales. Infraestructura contiene detalles técnicos como persistencia, servicios externos o mensajería.

11.10 Paquetes anidados

Un paquete puede contener otros paquetes. Esto se conoce como anidamiento. Es útil para representar estructuras jerárquicas. Por ejemplo, dentro del paquete Pedidos podrían existir subpaquetes como Consulta, Registro, Cancelación e Integraciones.

El anidamiento debe usarse con moderación. Demasiados niveles pueden volver difícil entender el modelo. Cuando la estructura se vuelve profunda, conviene revisar si el diagrama necesita dividirse en varias vistas.

11.11 Visibilidad entre paquetes

En algunos modelos puede ser importante indicar qué elementos de un paquete están disponibles para otros paquetes y cuáles quedan internos. Esta idea se relaciona con encapsulamiento y separación de responsabilidades.

No siempre se muestra visibilidad en un diagrama de paquetes. Pero cuando se modela una arquitectura más formal, puede ser útil distinguir elementos públicos, interfaces disponibles y detalles internos que no deberían ser usados desde afuera.

11.12 Paquetes y diagramas de clases

Los paquetes ayudan a organizar diagramas de clases grandes. En lugar de colocar muchas clases en una sola vista, se pueden agrupar en paquetes y crear diagramas separados para cada grupo.

Por ejemplo, un paquete Pagos puede contener MedioDePago, PagoConTarjeta, PagoConTransferencia y ServicioDePagos. Otro paquete Pedidos puede contener Pedido, LíneaDePedido y EstadoPedido. El diagrama de paquetes muestra la organización general; los diagramas de clases muestran el detalle interno.

11.13 Paquetes y casos de uso

Los paquetes también pueden agrupar casos de uso. En sistemas grandes, puede ser útil organizar funcionalidades por área: Gestión de usuarios, Gestión de turnos, Administración, Reportes o Integraciones.

Esto permite dividir el análisis en partes manejables. Cada paquete puede tener su propio conjunto de casos de uso y su propia documentación detallada.

11.14 Acoplamiento entre paquetes

El acoplamiento indica cuánto depende una parte del sistema de otra. Un diagrama de paquetes puede ayudar a detectar dependencias excesivas. Si muchos paquetes dependen de un paquete central, ese paquete puede convertirse en un punto crítico. Si existen dependencias circulares, el diseño puede volverse difícil de mantener.

Reducir acoplamiento no significa eliminar toda dependencia. Significa controlar dependencias para que cada parte tenga responsabilidades claras y cambios localizados.

11.15 Dependencias circulares

Una dependencia circular ocurre cuando un paquete depende directa o indirectamente de otro que, a su vez, depende del primero. Por ejemplo, A depende de B y B depende de A. También puede ocurrir mediante una cadena: A depende de B, B depende de C y C depende de A.

Las dependencias circulares suelen dificultar pruebas, mantenimiento y evolución. Un diagrama de paquetes permite hacer visible este problema y discutir alternativas de diseño.

11.16 Ejemplo: sistema de turnos médicos

En un sistema de turnos médicos, se podrían crear paquetes como Pacientes, Profesionales, Turnos, Agenda, Notificaciones y Reportes. El paquete Turnos podría depender de Agenda para consultar disponibilidad y de Notificaciones para enviar avisos. Reportes podría depender de Turnos y Profesionales para generar estadísticas.

Esta vista permite comprender la organización general del sistema sin mostrar todas las clases internas.

11.17 Cuándo usar diagramas de paquetes

Conviene usar diagramas de paquetes cuando el modelo tiene muchos elementos o cuando se necesita explicar la organización de alto nivel. También son útiles para revisar dependencias entre capas, módulos o áreas funcionales.

No son necesarios para sistemas muy pequeños si la organización resulta evidente. Su utilidad aumenta cuando el volumen de clases, casos de uso o componentes dificulta la comprensión.

11.18 Criterios de revisión

  • ¿Cada paquete agrupa elementos relacionados por un criterio claro?
  • ¿Los nombres de paquetes expresan responsabilidades reconocibles?
  • ¿Las dependencias tienen dirección correcta?
  • ¿Existen dependencias circulares que deban revisarse?
  • ¿El diagrama muestra organización general sin exceso de detalle?
  • ¿Los paquetes ayudan a comprender el sistema o solo agregan decoración?

11.19 Errores frecuentes

  • Crear paquetes sin un criterio de agrupación claro.
  • Usar nombres vagos como Varios, General o Utilidades para todo.
  • Mostrar demasiados elementos internos y perder la vista general.
  • No indicar dependencias importantes entre paquetes.
  • Dibujar dependencias en la dirección incorrecta.
  • Ignorar dependencias circulares que afectan el mantenimiento.
  • Confundir paquetes UML con carpetas físicas sin analizar responsabilidades.

11.20 Qué debes recordar de este tema

  • Un paquete agrupa elementos relacionados del modelo.
  • El diagrama de paquetes permite ver organización y dependencias de alto nivel.
  • Los paquetes pueden organizarse por áreas funcionales, capas, módulos o subsistemas.
  • Las dependencias indican que un paquete necesita elementos de otro.
  • La dirección de la dependencia es importante para analizar impacto de cambios.
  • Las dependencias circulares suelen ser señales de diseño que conviene revisar.

11.21 Conclusión

El diagrama de paquetes ayuda a organizar modelos grandes y a observar dependencias entre partes del sistema. Es una herramienta útil para mantener claridad cuando el número de clases, casos de uso o componentes comienza a crecer.

En el próximo tema veremos diagramas de secuencia, que permiten representar la interacción entre objetos a través del tiempo.