# Diagrama de paquetes

Un diagrama de paquetes en el Lenguaje Unificado de Modelado representa las dependencias entre los paquetes que componen un modelo. Es decir, muestra cómo un sistema está dividido en agrupaciones lógicas y las dependencias entre esas agrupaciones.
Dado que normalmente un paquete está pensado como un directorio, los diagramas de paquetes suministran una descomposición de la jerarquía lógica de un sistema.
Los paquetes están normalmente organizados para maximizar la coherencia interna dentro de cada paquete y minimizar el acoplamiento externo entre los paquetes. Con estas líneas maestras sobre la mesa, los paquetes son buenos elementos de gestión. Cada paquete puede asignarse a un individuo o a un equipo, y las dependencias entre ellos pueden indicar el orden de desarrollo requerido.

## Relaciones entre paquetes

Entre paquetes pueden existir relaciones de dependencia y generalización.
Las dependencias entre paquetes denotan que algún elemento de un paquete depende de los elementos en otro paquete. Existen diferentes tipos de relaciones de dependencia entre paquetes:
* Importación: Modelado como una dependencia estereotipada con <<import>>.
* Acceso: Modelado como una dependencia estereotipada con <<access>>.
* Combinación: Modelado como una dependencia estereotipada con <<merge>>.
* Exportación: Modelado implícitamente a través de la visibilidad pública en los elementos del paquete. No se exporta explícitamente a algún paquete.
La importación de paquetes o import se define como "una relación entre un espacio de nombres de importación y un paquete, lo que indica que el espacio de nombres importador agrega los nombres de los miembros del paquete a su propio espacio de nombres". Por defecto, una dependencia entre dos paquetes sin etiqueta se interpreta como una relación de este tipo.
Tanto la importación de paquetes como el acceso de paquetes indican que el paquete origen, paquete fuente o paquete importador, tiene acceso al contenido del paquete destino, es decir, el contenido público del destino se añade al espacio de nombres del origen. La diferencia radica en que la importación de paquetes añade los elementos públicos del paquete destino al espacio de nombres público del origen, mientras que el acceso de paquetes añade los elementos públicos del destino al espacio de nombres privado del origen. Ambas relaciones son transitivas.
Una relación de combinación o fusión entre paquetes especifica que el contenido del paquete origen (receptor) se extiende con el contenido del paquete destino. La combinación de paquetes o merge se define como "una relación dirigida entre dos paquetes, que indica que el contenido de los dos paquetes se va a combinar. Es muy similar a la generalización en el sentido de que el elemento fuente añade conceptualmente las características del elemento destino para sus propias características lo que resulta en un elemento que combina las características de ambos". En esta relación, si existe un elemento tanto en el paquete fuente y el paquete de destino, después la definición del elemento de origen se ampliará para incluir la definición del elemento de destino.
Una generalización es una relación entre un clasificador más general (superclase) y un clasificador más específico (subclase). Cada instancia del clasificador específico es también una instancia indirecta del clasificador general. La generalización entre paquetes es similar a la generalización entre clases, los paquetes hijos heredan los elementos del paquete padre. La generalización entre paquetes suele utilizarse para especificar familias de paquetes.

## Elementos básicos

* Paquete: Un mecanismo de propósito general para la organización de elementos y diagramas de modelo en grupos. Proporciona un espacio de nombres encapsulado dentro del cual todos los nombres deben ser únicos. Se utiliza para agrupar elementos relacionados semánticamente. Es un espacio de nombres, así como un elemento que puede estar contenida en los espacios de nombres de otros paquetes. Visualmente se representa como una carpeta.
* Dependencia: Indica que un elemento de un paquete requiere a otro de un paquete distinto. Visualmente se representa mediante una flecha discontinua con inicio en el paquete que depende del otro, es decir, la flecha parte del elemento de origen y apunta hacia el elemento destino.
* Estereotipos: Existen tres estereotipos de relación de dependencia entre paquetes. Visualmente un estereotipo de dependencia se representa como el nombre de la dependencia entre un par de símbolos mayor y un par de símbolos menor (<< >>), se coloca junto a la flecha que señala la dependencia. <<import>> significa una importación pública, los elementos importados tienen visibilidad pública dentro del espacio de nombre del paquete origen o paquete importador, <<access>> significa una importación privada, se utiliza para indicar la visibilidad privada, y <<merge>> significa que la fuente de la combinación importa los contenidos importados por el destino.

## Visibilidad de los elementos

Los paquetes controlan la visibilidad de los elementos que contienen.
Visualmente se representa la visibilidad de los elementos anteponiendo a su nombre uno de los símbolos: +, para los públicos, -, para los privados, y #, para los protegidos.
* +: El elemento es público. Se encuentra disponible a otros elementos del paquete contenedor o uno de sus paquetes anidados, y a los paquetes que importan el paquete contenedor.
* -: El elemento es privado. No disponibles fuera del paquete contenedor.
* #: El elemento está protegido. No son posibles el resto de visibilidades.