Download Observable

Document related concepts
no text concepts found
Transcript
Algoritmos y Programación III
7. Diseño, primeros
patrones, MVC
Carlos Fontela, 2006
Temario

Diseño OO y patrones

Presentación de patrones de uso habitual


Iterador

Factory Method

Template Method
MVC y Observador
Qué es diseño

Es el “cómo” del desarrollo

Fase más ingenieril del desarrollo de software
• Lástima que se lo llame “arquitectura”

Concebir una solución para un problema

Entre el “qué” de los requerimientos y el
producto terminado

Propósito: crear una estructura interna
clara y lo más simple posible
Patrones

Solución exitosa de un problema que
aparece con frecuencia


Patrones de diseño


“Alguien ya ha resuelto nuestros problemas”
Para problemas de diseño
Patrones de programación

Algoritmos “con nombre”
• Métodos de ordenamiento, búsqueda

Incluyen el algoritmo y una estructura de
datos
Uso de patrones

Enseñanza

Aplicación en distintos contextos

Comprensión de partes de un
sistema

Comunicación con un vocabulario
común

Hay en otras ingenierías
Qué diseñamos

Despliegue en hardware

Subsistemas o componentes de software y
sus interacciones

Integración con otros sistemas

Interfaz de usuario

Estructuras de datos

Algoritmos

Definiciones tecnológicas

Plataforma, lenguaje, base de datos, etc.
Diseño de IU

O Diseño externo

Usabilidad y demás

Ver diapositivas en sitio web

¡Pero verlas!
Diseño interno



Arquitectura de componentes
Arquitectura de despliegue
Arquitectura de conectividad


Diseño de datos


Protocolos y dispositivos a usar
Estructura de las bases de datos y la
persistencia
Software

Lenguajes, herramientas y nomenclatura que
se van a utilizar en la programación
Diseño de clases

Clases de diseño
Describen conceptos de alto nivel
 Pertenecen al dominio de la solución


Clases de implementación
Surgen por necesidades algorítmicas,
como un tipo de vector o árbol
 Para encontrarlas se aplican los
conocimientos de algoritmos y
estructuras de datos

Patrones: creación de objetos

Veamos
Iterator i = v.iterator();
while (i.hasNext()) { ... i.next(); ... }

¿Por qué no hacemos:
Iterator i = new ...

Iterator es una interfaz


?
¿Dónde está la clase?
¿Ventajas?
Iterador en Java
Iterador: consecuencias (I)

Simplifica la interfaz de la colección

No hay recorridos

No expone la estructura de la
colección

Cumple el principio de Única
Responsabilidad

Mantiene alta la cohesión
Iterador: consecuencias (II)

Soporte de recorridos diferentes

O simultáneos

Cambiando la clase de iterador

No en Java, sí en C++
Iterador: implementación

Control externo
Cliente maneja el iterador mediante el
método next()
 Muy flexible


Control interno
Iterador opera sobre los elementos, y
controla el proceso
 Hay que decirle qué operación aplicar a
los elementos
 Uso muy sencillo, implementación
compleja

Iterador como patrón

La interfaz java.util.Iterator es muy
útil

Pero se puede extender si se desea

También hay iteradores en otros
lenguajes

Pero si no los hubiera se podrían
implementar

Como cualquier patrón de diseño
Iterador: UML
Factory Method

El caso de iterator() en Java

Un método que crea instancias cuyo tipo
es una interfaz o una clase abstracta

Se mantiene una jerarquía de clases
creadoras paralela a la jerarquía de clases
a crear
Template Method: polimorfismo
Template Method es el uso crudo del
polimorfismo
 Se basa en encapsular trozos de
algoritmos
 Se lo llama también Application
Framework: ¿se ve por qué?
 Ejemplo conocido: clase Thread


¿Por qué redefinimos run() e invocamos
a start()?
Template method: UML
Template Method: varios (I)

Los métodos a redefinir pueden ser
abstractos en la clase plantilla


O ser simples ganchos (“hooks”) con
una implementación vacía o por defecto
El método plantilla debería ser final
Controla la lógica del algoritmo
 Es un marco o framework
 Los cambios deberían afectar solamente
a los métodos redefinibles, que son los
que definen los detalles

Template Method: varios (II)

La clase plantilla delega en subclases
la implementación de los detalles



Brinda un marco general, esqueleto o
armazón
Decide cuándo y cómo utilizar las clases
descendientes
Granularidad => Flexibilidad


Pero más difícil de implementar
Salvo que se usen implementaciones
por defecto
Template Method: usos

Applets de Java



Muchos puntos de extensión, con
implementaciones por defecto
Métodos init(), start(), destroy(), etc.
Arrays.sort (Comparable[])

Se debe definir compareTo()

Pero no mediante herencia
Patrones: principios

Encapsular lo que varía

Preferir la composición a la herencia

Programar usando interfaces, no
implementaciones

Bajo acoplamiento en la interacción entre
objetos

Mantener las clases abiertas para
extensión y cerradas para modificación

Una sola responsabilidad por clase
Diseño de arquitectura: MVC



Se suele combinar
con otros
Bueno en
aplicaciones de
mucha IU
Ventajas


Facilitar cambios
Muchas vistas por
cada modelo
Observador: presentación (I)

Paradigma de publicador - suscriptor.
Para manejo de eventos
 Para MVC
 Para mensajería


Hay dos objetos:
Observador (pueden ser varios)
 Observado o sujeto


Cambios en el estado de Observado
provocan cambios en Observador
Observador: uso
Observador: estructura
Observador: consecuencias

Bajo acoplamiento entre sujeto y
observadores





El sujeto no se preocupa de los observadores
Ni cambia si se registran observadores de tipos
diferentes
Lo único que sabe es que implementan una
determinada interfaz
Los observadores se suscriben y desuscriben
libremente a una lista de referencias
Soporte de broadcasting

Agregado y remoción dinámica de
observadores
Observador: implementación

Lo típico


Guardar lista de observadores en sujeto
Actualizaciones se materializan al
cambiar estado del sujeto
• Posiblemente provoque muchos update()

Ojo

Referencias colgadas en lenguajes sin
recolección de basura
Observador: variantes (I)

Modelo “push”



Sujeto envía toda la info que requieren
los observadores
Mayor acoplamiento: provoca una
interfaz de observador específica
Se envía información detallada, sin
importar la incumbencia para los
observadores
Observador: variantes (II)

Modelo “pull”
Sujeto no envía info, sólo notifica
 Observadores consultan luego lo que les
interesa
 Puede ser ineficiente
 Bien desacoplado


Modelo con eventos

Se registran observadores sólo para
ciertos eventos o temas (uno o más)
Observador en java.util (I)
Observador en java.util (II)

Definir una clase descendiente de
Observable (que es una clase), para hacer
de sujeto:




que ante determinados cambios, invoque los
métodos setChanged y notifyObservers
Si no se llamó a setChanged, notifyObservers
no invoca los update
En general los métodos de Observable no
se redefinen
Construir una clase que implemente
Observer,

implementando el método update
Observador en java.util (III)

¡Pero Observable es una clase!




setChanged es protegido



Y Java admite herencia simple
Imposible extender un sujeto de otra clase de
dominio
Tampoco se puede implementar los sujetos de
otra manera que no sea la de java.util
Sólo puedo implementarlo en subclases
No puedo utilizar composición
java.util.Observable no es muy útil

Hay alternativas en JavaBeans y en AWT
Resumen

El diseño ha sido revalorizado con la OO

Incluye diseño de arquitecturas y de
clases

Diseño debe mantenerse sencillo y claro

Observador


Desacopla un sujeto observado de
observadores
MVC

Desacopla vista, modelo y controlador
Bibliografía

La Web

UML y patrones


Orientación a objetos con Java y UML


Craig Larman
Carlos Fontela
Enterprise Solution Patterns Using
Microsoft .NET

En MSDN, Patterns and Practices
Qué sigue

Diseño de interfaces de usuario
Ver en la web
 ¡verlo!

Patrones de diseño
 Vuelta a programación

Concurrencia
 Buen código OO
 Aplicaciones distribuidas e integración
de aplicaciones

Muchas Gracias.
Carlos Fontela, 2006