Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Curso UML
Curso UML
Curso UML
Introduccin
Visin general
Herramientas de diseo UML
Diagramas UML
Diagrama de Actividades
Diagrama de Secuencia
Diagrama de Colaboracin (UML 1.0)/Comunicacin (UML 2.0)
Diagrama de Estados
Diagrama de clases
Casustica tpica del trabajo con diagramas
Tipos de relaciones
Diagramas de Clases
Relaciones de asociacin especficas
Subtipos de asociaciones
Interfaces
Otros diagramas menos usados
Modelado de casos de uso
Ciclo de vida del software y diagramas
Realizacin del caso de uso: Ficha
Casos de uso ms complejos
Patrones de diseo
Colecciones de patrones de diseo
Patrones GoF
Singleton
AbstractFactory
Proxy
Patrones JEE
Business Delegate
Data Access Object (DAO)
Value List Handler
Introduccin
Este artculo son los apuntes que escrib durante el curso de UML que imparti Grupo PA en
RBC Dexia IS en Enero de 2011. Todo fue escrito usando Google Docs y UMLet mientras el
profesor daba la clase, as que fue escrito practicamente en tiempo real. Hay algunas
modificaciones como por ejemplo una correcta implementacin del patrn Singleton, que
aunque en clase se dio una polticamente correcta, no era una buena implementacin hecha en
Java que es lo que nos interesa. Tambin se elimin el patrn SessionFaade por
ValueListHandler que me pareca ms interesante. Adems de ciertas licencias que me he
tomado para dar ms sentido a las explicaciones del profesor.
Visin general
Qu es UML?, es un lenguaje de modelado. Con l podemos describir especificaciones
funcionales, algoritmos, diagramas de estado, la arquitectura de un sistema, etc.
La especificacin de UML se puede descargar de http://www.omg.org.
Diagramas UML
Casos de Uso
Representan la funcionalidad del sistema. Hay dos elementos, actores y funcionalidades. Los
actores pueden ser personas o sistemas externos.
Hay que seguir la norma KISS (Keep It Simple Stupid), ya que los diagramas se deben
mantener inteligibles, complicarlos demasiado los vuelve inmantenibles, como todo.
Diagrama de Actividades
Se utiliza para modelar etapas de un proceso. Es decir, es lo que era un DFD (Diagrama de
Flujo de Datos) con el que se pueden representar algoritmos, o el funcionamiento de cualquier
proceso, mtodo, etc.
Se usan cuando el caso de uso es complejo, no hace falta hacer un diagrama de actividad para
cada caso de uso, algunos son obvios y no se suelen hacer, aunque es muy recomendable.
Diagrama de Secuencia
Modela la interaccin entre objetos durante el ciclo de ejecucin de un proceso. Es decir, la
secuencia de llamadas entre objetos en un periodo de tiempo.
No se deben mostrar caminos alternativos, si no un nico flujo, es decir, no se muestra la
secuencia de cuando todo va bien, y de cuando hay otras bifurcaciones durante la ejecucin, si
no slo una de ellas.
Diagrama de clases
Modela cualquier elemento estructural (Clases) del sistema, y sus relaciones. Una clase, sus
atributos y sus mtodos (operaciones) se representa as:
El estereotipo sirve para dar una particularidad a la clase, es como declararle un tipo, por tanto,
puede haber unas clases de un estereotipo, otras de otro, etc. Podramos escribir un diagrama
de cualquier tipo de los mencionados hasta ahora con un diagrama de clases usando
estereotipos:
Un ejemplo algo ms complejo con otros tipos de relaciones (herencia, composicin, etc.) sera
este:
Tipos de relaciones
Asociacin (lnea continua, flecha abierta). Cooperacin entre clases.
Herencia (lnea continua acabada en tringulo). Un elemento adquiere las propiedades
de otro.
Dependencia (lnea discontinua, flecha abierta). Vnculo genrico de necesidad entre
clases.
Implementacin (lnea discontinua acabada en tringulo). El elemento origen de la
flecha realiza al elemento destino. Quiere decir que implementa la interfaz definida por
el destino.
Diagramas de Clases
Para ver algunas de las relaciones que se pueden representar en un diagrama de clases,
vamos a dibujar un diagrama de lo que podra ser un sistema de gestin de regalos:
Todas las clases definidas deberan tener atributos y mtodos, si una clase no tiene alguno de
ellos, posiblemente no hara falta crearla.
Relaciones de asociacin especficas
Las relaciones tambin se pueden caracterizar por:
Estereotipo.
Navegabilidad. La direccin de la flecha o flechas de la relacin especifica desde donde
o hasta donde se puede navegar desde una clase.
Cardinalidad.
Restricciones: Se representan con {}. Por ejemplo: {balance < 5000}.
Roles: Es el papel que juega la clase dentro de la relacin (titular/propiedad,
profesor/alumno). No se suele usar, sobre carga el diagrama.
Subtipos de asociaciones
Agregacin: Una clase se compone de objetos de otras clases. Por ejemplo una
factora que monta coches. El coche se compone de ciertas partes como ruedas,
volante, etc. Los componentes tienen sentido por separado, pero juntos forman el
coche.
Composicin: Una clase crea objetos de otras clases, y stas no tienen sentido si la
clase que las crea. Por ejemplo los movimientos de una cuenta no tienen sentido si la
cuenta deja de existir. Otro ejemplo podra ser el humo que sale de un coche. El humo
no puede existir si no existe el coche.
Interfaces
Un interfaz es un elemento de programacin que define mtodos sin cdigo. Se representa as:
Se dice que define lo que puede hacer, pero no cmo lo hace. Son los implementadores de la
interfaz los que dicen cmo se hace, es decir, los que implementan una manera propia de
realizar los mtodos/operaciones definidos por la interfaz. Un interfaz es como un estndar.
Esto no quiere decir que todos los implementadores lo hagan bien, un implementador puede
dejar el mtodo en blanco, o puede hacerlo mal. Un ejemplo real puede ser una conexin de
BBDD en en Java. Se define una interfaz en las clases estndar de Java, y cada fabricante
crea una implementacin para usar sus BBDD:
Otros diagramas menos usados
Diagrama de paquetes: Es una simplificacin de un diagrama de clases, slo se
representan los paquetes de los que pertenecen las clases. Son muy tiles para ver las
dependencias entre los paquetes de un sistema. Se pueden localizar ciclos, o
dependencias que no deberan existir o que son redundantes.
Los casos de uso dependientes son beneficiosos para la reutilizacin de otros casos de uso,
tambin para la planificacin, ya que se pueden ver las dependencias entre funcionalidades, es
decir, la planificacin del proyecto depender de estos casos de uso.
Una buena opcin para que no se compliquen los casos de uso es tener una versin simple, y
otra compleja, depende de a quin lo vayamos a ensear.
Patrones de diseo
Su cometido es el de proponer una solucin a un problema que ocurre continuamente en
diferentes mbitos del desarrollo del software. Se proporciona un patrn que hay que extrapolar
a nuestro caso particular. Suele proponerse un diagrama de clases o secuencia que
deberemos adaptar a nuestro sistema.
Patrn de diseo => Problema recurrente => Solucin genrica => N implementaciones.
Para la solucin genrica se usa UML, precisamente para que sea genrico, y se suelen usar
los diagramas de clases y de secuencia para describirlos.
Falta de testing.
Cerrar conexiones.
Problemas de concurrencia.
Interbloqueo.
Inconsistencia de datos.
Problemas de rendimiento.
CPU.
Memoria.
Patrones GoF
Vamos a ver algunos de los ms tpicos patrones de diseo de los GoF.
Singleton
Problema: En ocasiones es complejo limitar las instancias de una clase. Es decir, queremos
que slo haya X instancias de un objeto. Por ejemplo, las conexiones a una BBDD hay que
limitarlas, no podemos crear ilimitadas instancias del objeto conexin porque saturamos la
BBDD.
Solucin: La mejor solucin en Java es usar una clase inner que sea la que cree la instancia
de la clase que la contiene. Hay otras soluciones ms precarias como el uso de synchronized,
pero no son recomendables por su bajo rendimiento. La solucin propuesta es totalmente
thread-safe. Para el que quiera profundizar en el tema es recomendable la lectura de
http://en.wikipedia.org/wiki/Double-checked_locking.
Cdigo fuente:
/**
* SingletonHolder se carga en la primera ejecucin de Singleton.getInstance()
* o en el primer acceso a SingletonHolder.INSTANCE, nunca antes.
*/
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
AbstractFactory
Problema: Creacin de objetos complejos o dependientes del entorno o sistema, o de otros
objetos, evitar y controlar el uso de new. Para que el cliente se abstraiga de la creacin estos
objetos, o no se tenga que preocupar de las dependencias de los mismos, etc., se usa este
patrn.
Solucin:
Proxy
Problema: Sistemas de caja negra y las interacciones con el sistema poco definidas.
Necesitamos crear objetos que consumen muchos recursos, pero no queremos instanciarlos a
no ser que el cliente lo solicite o se cumplan otras condiciones determinadas.
Solucin: La clase proxy actuar como capa previa al acceso del objeto al que queremos
acceder realmente, es posible que cuando llamamos a un mtodo de este proxy, ste haga
algunas cosas antes o despus de lo que hara el mtodo original.
Patrones JEE
Business Delegate
Problema: Los componentes de la capa de presentacin interactuan directamente con los
servicios de la capa de negocio. Esta interaccin directa expone los detalles de implementacin
de la interfaz de servicio de negocio a la capa de presentacin. Como resultado, los
componentes de niveles de presentacin son vulnerables a los cambios en la aplicacin de los
servicios de negocio. Cuando la aplicacin cambia los servicios, el cdigo de la aplicacin en la
capa de presentacin debe cambiar tambin.
Adems, puede haber un impacto negativo en el rendimiento de la red porque los componentes
de niveles de presentacin que utilizan la API de servicios pueden hacer llamadas en la red.
Solucin: Usar un Business Delegate para reducir el acoplamiento entre los clientes de niveles
de presentacin y los servicios de negocio. El Business Delegate oculta los detalles de
implementacin del servicio de negocio, tales como operaciones de bsqueda y acceso a los
detalles de la arquitectura.
Data Access Object (DAO)
Problema: Los sistemas tienen que acceder a BBDD mediante JDBC o cualquier otra librera
de acceso a BBDD, o puede que necesite acceder a datos en LDAP, o tiene que recuperar
informacin mediante servicios web de un sistema externo, etc.
El DAO tendr las consultas SQL, accesos mediante Hibernate, consultas a terceros, etc. COn
lo que el BusinessClient no se entera de cmo se recuperan esos datos, no tiene que abrir ni
cerrar conexiones y no sabe si es a LDAP, BBDD o a una aplicacin externa.
Solucin: Usar un clase que sea la responsable de tratar los resultados, a la que le podamos
pedir una pgina nueva de resultados, a la que le podamos pedir que guarde los resultados en
cach. Esta clase (ValueListHandler) usa un DataAccessObject para ejecutar la consulta
requerida, almacena los resultados. El cliente puede solicitarle pginas de resultados a nuestro
ValueListHandler que usar un iterador para recorrerlos.