Está en la página 1de 6

Machine Translated by Google

Capítulo 5
CAPÍTULO 5

Modelado de la estructura lógica de un sistema:


Diagramas de clases avanzados5

Si todo lo que pudiera hacer con los diagramas de clase fuera declarar clases con atributos y operaciones
simples, entonces UML sería un lenguaje de modelado bastante pobre. Afortunadamente, la orientación
a objetos y UML permiten hacer mucho más con las clases que simples declaraciones. Para empezar,
las clases pueden tener relaciones entre sí. Una clase puede ser un tipo de otra clase (generalización) o
puede contener objetos de otra clase de varias maneras dependiendo de qué tan fuerte sea la relación
entre las dos clases.

Las clases abstractas lo ayudan a declarar parcialmente el comportamiento de una clase, lo que permite
que otras clases completen los fragmentos abstractos de comportamiento que faltan como mejor les
parezca. Las interfaces llevan las clases abstractas un paso más allá al especificar solo las operaciones
necesarias de una clase pero sin ninguna implementación de operación. Incluso puede aplicar
restricciones a sus diagramas de clase que describen cómo se pueden usar los objetos de una clase con
el lenguaje de restricción de objetos (OCL).

Las plantillas completan el cuadro al permitirle declarar clases que contienen un comportamiento
completamente genérico y reutilizable. Con las plantillas, puede especificar lo que hará una clase y luego
esperar (hasta el tiempo de ejecución si lo desea) para decidir con qué clases trabajará.

Juntas, estas técnicas completan su caja de herramientas de diagrama de clases. Representan algunos
de los conceptos más poderosos en el diseño orientado a objetos y, cuando se aplican correctamente,
pueden marcar la diferencia entre un diseño correcto y una gran pieza de diseño reutilizable.

Relaciones de clase
Las clases no viven en el vacío: trabajan juntas usando diferentes tipos de relaciones. Las relaciones
entre clases vienen en diferentes puntos fuertes, como se muestra en la Figura 5-1.

La fuerza de una relación de clase se basa en cuán dependientes son entre sí las clases involucradas
en la relación. Se dice que dos clases que son fuertemente dependientes entre sí están estrechamente
acopladas; los cambios en una clase probablemente afectarán a la

83

Este es el Título del Libro, Edición eMatter Copyright ©


2008 O'Reilly & Associates, Inc. Todos los derechos reservados.
Machine Translated by Google

Relación de clase más débil Relación de clase más fuerte

Dependencia Asociación Agregación Composición Herencia

Flecha discontinua Línea de conexión simple Flecha de diamante vacía Flecha de diamante llena Flecha vacía

Cuando los objetos de Cuando los objetos de Cuando una clase posee pero Cuando una clase Cuando una clase es un

una clase funcionan una clase funcionan comparte una referencia a contiene objetos de otra tipo de otra clase
brevemente con objetos de otra con
claseobjetos de otra clase objetos de otra clase clase

durante un tiempo
prolongado

Figura 5-1. UML ofrece cinco tipos diferentes de relaciones de clase

otra clase El acoplamiento estrecho suele ser, aunque no siempre, algo malo; por lo tanto,
cuanto más fuerte sea la relación, más cuidadoso debe ser.

Dependencia
Una dependencia entre dos clases declara que una clase necesita saber acerca de otra clase
para usar objetos de esa clase. Si la clase UserInterface del CMS necesitara trabajar con un
objeto de la clase BlogEntry , entonces esta dependencia se dibujaría usando la flecha de
dependencia, como se muestra en la Figura 5-2.

La flecha de la dependencia

Interfaz de usuario Entrada de blog

Figura 5-2. UserInterface depende de la clase BlogEntry porque necesitará leer el contenido de las
entradas de un blog para mostrárselas al usuario.

Las clases UserInterface y BlogEntry simplemente funcionan juntas cuando la interfaz de


usuario desea mostrar el contenido de una entrada de blog. En términos de diagrama de
clases, las dos clases de objetos dependen entre sí para garantizar que funcionen juntas en
tiempo de ejecución.

Una dependencia implica solo que los objetos de una clase pueden trabajar juntos; por lo
tanto, se considera que es la relación directa más débil que puede existir entre dos clases.

La relación de dependencia se usa a menudo cuando tiene una clase que


proporciona un conjunto de funciones de utilidad de uso general, como en los
paquetes de expresiones regulares (java.util.regex) y matemáticas (java.math)
de Java . Las clases dependen de las clases java.util.regex y java.math para
usar las utilidades que ofrecen esas clases.

84 | Capítulo 5: Modelado de la estructura lógica de un sistema: diagramas de clases avanzados

Este es el Título del Libro, Edición eMatter


Copyright © 2008 O'Reilly & Associates, Inc. Todos los derechos reservados.
Machine Translated by Google

Asociación
Aunque la dependencia simplemente permite que una clase use objetos de otra clase, la asociación
significa que una clase en realidad contendrá una referencia a un objeto u objetos de otra clase.
la otra clase en forma de atributo. Si te encuentras diciendo que una clase
trabaja con un objeto de otra clase, entonces la relación entre esas clases es una
gran candidato para la asociación en lugar de sólo una dependencia. Se muestra la asociación
usando una línea simple que conecta dos clases, como se muestra en la Figura 5-3.

Línea de asociación
Nombre de la Asociación

(opcional)

1
posee *
BlogCuenta Entrada de blog
- Blog - entradas

Figura 5-3. La clase BlogAccount se asocia opcionalmente con cero o más objetos de la
clase BlogEntry; el BlogEntry también está asociado con una y solo una BlogAccount

La navegabilidad a menudo se aplica a una relación de asociación para describir qué clase
contiene el atributo que soporta la relación. Si toma la Figura 5-3 tal como está actualmente e
implementa la asociación entre las dos clases en Java, entonces
obtendría algo como lo que se muestra en el Ejemplo 5-1.

Ejemplo 5-1. Las clases BlogAccount y BlogEntry sin navegabilidad aplicadas a sus
relación de asociación

Cuenta de blog de clase pública {

// Atributo introducido gracias a la asociación con la clase BlogEntry


entradas privadas de BlogEntry[];

// ... Otros atributos y métodos declarados aquí ...


}

entrada de blog de clase pública {

// Atributo introducido gracias a la asociación con la clase Blog


blog privado de BlogAccount;

// ... Otros atributos y métodos declarados aquí ...


}

Sin más información sobre la asociación entre BlogAccount y


Clases BlogEntry , es imposible decidir qué clase debe contener el atributo introducido de la
asociación; en este caso, ambas clases tienen un atributo agregado. Si esto
fue intencional, entonces podría no haber ningún problema; sin embargo, es más común
tienen solo una clase que hace referencia a la otra en una asociación.

Relaciones de clase | 85

Este es el Título del Libro, Edición eMatter


Copyright © 2008 O'Reilly & Associates, Inc. Todos los derechos reservados.
Machine Translated by Google

En nuestro sistema, tiene más sentido poder preguntar a una cuenta de blog qué entradas
contiene, en lugar de preguntar a la entrada a qué cuenta de blog pertenece. En este caso,
usamos la navegabilidad para asegurar que la clase BlogAccount obtenga el atributo introducido
de asociación, como se muestra en la figura 5-4.

1
posee *
BlogCuenta Entrada de blog
- entradas

La “No Navegabilidad” La Navegabilidad


Cruz Flecha

Figura 5-4. Si cambiamos la Figura 5-3 para incorporar la flecha de navegabilidad, entonces podemos declarar que
debería poder navegar desde el blog a sus entradas

Actualizar la asociación entre la clase BlogAccount y la clase BlogEntry como


que se muestra en la Figura 5-4 daría como resultado el código que se muestra en el Ejemplo 5-2.

Ejemplo 5-2. Con la navegabilidad aplicada, solo la clase BlogAccount contiene una asociación
atributo introducido

Cuenta de blog de clase pública {

// Atributo introducido gracias a la asociación con la clase BlogEntry


entradas privadas de BlogEntry[] ;

// ... Otros atributos y métodos declarados aquí ...


}

entrada de blog de clase pública


{
// El atributo blog ha sido eliminado ya que no es necesario para el
// BlogEntry para conocer la BlogAccount a la que pertenece.

// ... Otros atributos y métodos declarados aquí ...


}

Clases de asociación

A veces, una asociación misma introduce nuevas clases. Las clases de asociación son
particularmente útiles en casos complejos cuando desea mostrar que una clase está relacionada con dos
clases porque esas dos clases tienen una relación entre sí, como se muestra en
Figura 5-5.

En la Figura 5-5, la clase BlogEntry está asociada con una BlogAccount. Sin embargo, dependiendo
de las categorías que contenga la cuenta, la entrada de blog también se asocia con
cualquier número de categorías. En definitiva, la relación de asociación entre un blog
cuenta y una entrada de blog da como resultado una relación de asociación con un conjunto de
categorías (¡uf!).

86 | Capítulo 5: Modelado de la estructura lógica de un sistema: diagramas de clases avanzados

Este es el Título del Libro, Edición eMatter


Copyright © 2008 O'Reilly & Associates, Inc. Todos los derechos reservados.
Machine Translated by Google

*
BlogEntry 1 BlogAccount

- nombre : Cadena - nombre: Cadena


- contenido : Cadena

Categoría

- nombre : Cadena

Figura 5-5. Una entrada de blog está asociada con una categoría en virtud del hecho de que está asociada con
una cuenta de blog en particular.

No existen reglas estrictas y rápidas sobre cómo se implementa exactamente una clase de asociación
en el código, pero, por ejemplo, las relaciones que se muestran en la Figura 5-5 podrían implementarse
en Java, como se muestra en el Ejemplo 5-3.

Ejemplo 5-3. Un método para implementar la relación BlogEntry a BlogAccount y la clase Categoría asociada
en Java

clase pública BlogAccount { cadena


privada nombre; categoría privada[]
categorías; entradas privadas de BlogEntry[];

categoría de clase pública { nombre


de cadena privada;
}

entrada de blog de clase pública


{ nombre de cadena privada;
categoría privada[] categorías
}

Agregación

Pasando un paso más allá de la asociación, nos encontramos con la relación de agregación.
La agregación es realmente solo una versión más fuerte de asociación y se usa para indicar que una
clase en realidad posee pero puede compartir objetos de otra clase.

La agregación se muestra usando una punta de flecha de diamante vacía al lado de la clase propietaria,
como se muestra en la Figura 5-6.

Agregación
Diamante

posee *
1
Autor BlogCuentas
- blogs

Figura 5-6. Una relación de agregación puede mostrar que un Autor posee una colección de blogs

Relaciones de clase | 87

Este es el Título del Libro, Edición eMatter Copyright


© 2008 O'Reilly & Associates, Inc. Todos los derechos reservados.
Machine Translated by Google

La relación entre un autor y sus blogs, como se muestra en la Figura 5-6, es mucho más fuerte que
una mera asociación. Un autor es dueño de sus blogs, y aunque pueda compartirlos con otros
autores, al final, sus blogs son suyos, y si decide eliminar uno de sus blogs, ¡entonces puede
hacerlo!

¿Dónde está el código? En realidad, la implementación del código Java para una relación de
agregación es exactamente la misma que la implementación de una relación de asociación; resulta
en la introducción de un atributo.

Composición

Avanzando un paso más en la línea de relación de clases, la composición es una relación aún
más fuerte que la agregación, aunque funcionan de manera muy similar. La composición se
muestra usando una punta de flecha de diamante cerrada o llena, como se muestra en la figura 5-7.

Composición
Diamante

1 1
Entrada de blog Introducción

Cuerpo principal

Figura 5-7. Una entrada de blog se compone de una introducción y un cuerpo principal.

La introducción de una entrada de blog y las secciones del cuerpo principal son en realidad partes
de la entrada de blog en sí y, por lo general, no se compartirán con otras partes del sistema. Si se
elimina la entrada del blog, también se eliminan sus partes correspondientes. Esto es exactamente
de lo que se trata la composición: estás modelando las partes internas que componen una clase.

Similar a la agregación, la implementación del código Java para una relación de composición da
como resultado solo la introducción de un atributo.

Generalización (también conocida como herencia)


La generalización y la herencia se utilizan para describir una clase que es un tipo de otra clase. Los
términos tiene un y es un tipo de se han convertido en una forma aceptada de decidir

88 | Capítulo 5: Modelado de la estructura lógica de un sistema: diagramas de clases avanzados

Este es el Título del Libro, Edición eMatter Copyright © 2008

O'Reilly & Associates, Inc. Todos los derechos reservados.

También podría gustarte