Documentos de Académico
Documentos de Profesional
Documentos de Cultura
06CursoOO DisenoEvolutivo
06CursoOO DisenoEvolutivo
la introduccin de ambigedad
Diseo evolutivo
6. Diseo evolutivo
NDICE
1. Introduccin.............................................................................................................192
1.1 El mtodo de trabajo....................................................................................................193
Primero, lo esencial..........................................................................................................................193
Hacer justo, lo necesario..................................................................................................................194
Software cerrado y abierto...............................................................................................................194
Definiciones flexibles.......................................................................................................................195
2.4 Segunda Ampliacin. Varias extracciones sobre una cuenta de varias posibles......212
2.4 Tercera Ampliacin: Control de Acceso......................................................................216
Escena de acceso..............................................................................................................................216
Cdigo Java ACCESO....................................................................................................................218
Integracin de acceso y extraccin..................................................................................................219
Estudio de alternativas de unin......................................................................................................221
2.4.1 Una iteracin. Otra forma de unin.........................................................................................224
2.4.2 Otra iteracin...........................................................................................................................225
2.4.3 Otra iteracin ms...................................................................................................................226
Interpretacin Arquitectnica del Sistema.......................................................................................230
2. 6 Recapitulemos.............................................................................................................242
191
Diseo evolutivo
1. Introduccin
Despus de haber hecho un recorrido por los cimientos del modelo orientado a
objetos, por sus conceptos y por partes de su cdigo, debemos comenzar a ver cmo se
pueden conseguir desarrollo y software evolutivo.
Una forma de desarrollo evolutivo es el llamado desarrollo iterativo e
incremental. Iterativo en el sentido amplio de correccin. Es decir, en el sentido de
reducir el error, de aproximarse ms. Se trata de corregir el rumbo del proyecto al
evaluar los resultados con el cliente, de eliminar las equivocaciones detectadas durante
las pruebas y de mejorar las cualidades internas del software, por ejemplo su
consistencia. Incremental en el sentido de aadir capacidades y funciones al software de
acuerdo con el crecimiento de las necesidades. Lo incremental y lo iterativo van juntos,
aunque no siempre se presentan los dos.
Hay muchas formas de desarrollo iterativo e incremental, con sus tcnicas y
mtodos respectivos. Probablemente, casi todas son buenas o, al menos, tienen muchos
aspectos buenos. Por tanto, lo ms importante es crear una actitud evolutiva hacia el
diseo y su modo de hacerlo, que se enriquezca despus con la diversidad de fuentes
disponibles. Este es el objetivo central del captulo.
Las palabras iterativo e incremental se utilizan en los procesos de
aproximaciones sucesivas. Se han tomado de ah porque tienen una finalidad semejante:
resolver problemas con incertidumbre. Tanto el desarrollo de software iterativo e
incremental como los procesos de aproximaciones sucesivas buscan un valor
desconocido. Pero, en el desarrollo de software ese valor desconocido es, adems,
inestable; se desplaza con el tiempo. Es como disparar a una diana poco visible que se
mueve con una componente de imprevisilidad.
Esa distincin establece una diferencia cualitativa entre el desarrollo evolutivo y
los procesos de aproximaciones sucesivas, sobre todo al acentuarse la componente
futura de la incertidumbre. Por tanto, son diferentes. No obstante, podemos aprovechar
sus similitudes, al menos en primera instancia.
192
Diseo evolutivo
Diseo evolutivo
sus operaciones ms frecuentes. Las excepciones y los detalles, dependiendo del riesgo,
se pueden dejar para despus.
Diseo evolutivo
abierto a los prximos incrementos. El software debe estar cerrado, funcionando, para
cobrar o para evaluarlo y, a la vez, debe ser relativamente sencillo de modificar para que
se adecue a las nuevas condiciones inciertas del contexto.
Se puede establecer una similitud con los mtodos numricos aproximados que
aportan, al final de cada vuelta, una solucin concreta, cerrada, para su evaluacin, pero
tambin abierta, susceptible de ser mejorada. Cada vuelta del proceso de desarrollo de
software debe ofrecer una solucin concreta para ser evaluada, al menos, y debe facilitar
la siguiente. ste es el sentido de software cerrado y abierto, un equilibrio difcil sobre
el que descansa una buena parte de las cualidades evolutivas del software, y tambin
nuestras cualidades como diseadores.
Sobre las cualidades que otorgan modificabilidad al software se puede decir
mucho, pero como mnimo, un software abierto debe permitir que las modificaciones
requieran muy poca revisin de lo anterior y, adems, que lo perturben muy poco.
La contradiccin cerrado y abierto es antigua en el mundo de la ingeniera.
Cualquier mquina debe tener construidas y ensambladas sus piezas, por lo menos, para
que funcione. Pero tambin se exige, a veces, que sea fcil de modificar. Sucede igual
en el software, slo que la exigencia de modificabilidad est presente casi siempre. Para
abordar esa contradiccin, la ingeniera tradicional invent la modularidad. Es decir, el
aislamiento y la independencia de los componentes. Insistimos, se invent, porque en la
naturaleza no se encuentran mdulos al estilo de la ingeniera.
Definiciones flexibles
Para resolver la contradiccin cerrado y abierto, la ingeniera de software
tambin utiliza la modularidad, pero adems, usa otras tcnicas propias del software, ya
referidas. Aunque los textos las tratan de forma independiente, nosotros proponemos
verlas de conjunto, como variantes de definiciones flexibles: definiciones parciales,
definiciones diferidas y definiciones ausentes.
Las definiciones parciales se consiguen ocultando una parte de la definicin, ya
sea dentro de los mdulos o delegando tareas a otros mdulos. Ambas tcnicas son
fundamentales y se aplican desde los tiempos del modelo estructurado para facilitar los
cambios en el software. Nosotros las utilizaremos sistemticamente en el diseo.
195
Diseo evolutivo
196
Diseo evolutivo
2.1 Introduccin
Se trata de construir el software para un cajero automtico muy simple. Un
problema familiar, por razones didcticas. Pero donde vamos a suponer que las
necesidades del cliente aparecern poco a poco y que no las conocemos de antemano. El
objetivo es apreciar el mtodo de desarrollo y diseo para abordar la incertidumbre. Si
el problema fuese realmente desconocido se desviara la atencin hacia la comprensin,
que no es nuestro asunto. Debemos concentrarnos en el mtodo de trabajo.
Desarrollaremos el software por aproximaciones sucesivas, comenzando por lo
ms importante. Las decisiones complementarias se van dejando para despus, cuando
se demuestre que hemos alcanzado lo esencial. As reducimos nuestro riesgo de hacer
algo ms all y tenerlo que desechar. Este ser nuestro modo cclico de actuar frente a la
incertidumbre: reducir progresivamente el riesgo. Hacer apuestas pequeas, contrario a
la Cascada, que lo apuesta todo a un disparo, supuestamente certero. Para que el
desarrollo sea evolutivo, el diseo tiene que serlo tambin.
197
Diseo evolutivo
oExtraccin
oInterfaz
Extraccin
oCuenta
oMonedero
trabaja
dameImporte
autoriza(importe)
entrega(importe)
resta(importe)
198
Diseo evolutivo
EXTRACCIN
son:
oCuenta: encargado de operar con la cuenta donde se extrae el importe. Una vez
ms, su papel es ocultar la forma de trabajar con la cuenta. Conoce el
mecanismo particular para autorizar una extraccin, incluso cmo hacerlo para
cada cliente. Por tanto, es el objeto que debe autorizar la entrega de dinero. La
variante de disear el objeto oCuenta slo para ocultar la informacin de la
cuenta, por ejemplo el saldo, requerira demasiada especializacin en
oExtraccin, que debe ser una operacin general.
Diseo evolutivo
Interfaz
Extraccin
Extraccin
Cuenta
Monedero
La clase Extraccin usa a la clase Cuenta: esta relacin representa los mensajes que
el objeto oExtraccin enva al objeto oCuenta: autoriza(importe) y resta(importe).
200
Diseo evolutivo
Interfaz
Extraccin
Cuenta
Monedero
201
Diseo evolutivo
<- 1
<- 2
<- 3
202
Diseo evolutivo
//Monedero Simple
import java.io.*;
<-1
<-2
<-3
<-4
<-5
203
Diseo evolutivo
<-1
<- 2
<- 3
204
Diseo evolutivo
Extraccin
Importe
Fecha
Cuenta
Trabaja
DameImporte
DameFecha
dameCuenta
Figura 6. Representacin de la clase Extraccin
Se aade una nueva responsabilidad al objeto oExtraccin: custodiar los datos
de una extraccin.
Este diseo muestra una diferencia notable con un diseo equivalente en
software estructurado. Mientras que en el software estructurado tendramos una sola
funcin para hacer todas las extracciones y guardar la informacin en un almacn,
separado de la funcin, en el software orientado a objetos hay un objeto por cada
extraccin que realiza la tarea y guarda, en su interior, la informacin.
La causa de esa importante diferencia radica en sus interpretaciones respectivas
del software. El modelo estructurado interpreta el software como funciones que actan
sobre datos, mientras que el modelo orientado a objetos interpreta el software como
mdulos integrales de datos y funciones, que interactan entre ellos para realizar tareas.
205
Diseo evolutivo
206
Diseo evolutivo
:Extraccin
oInterfaz
Extraccin
oGestor
extracciones
oCuenta
oMonedero
trabaja
dameImporte
autoriza(importe)
entrega(importe)
resta(importe)
agrega(me)
207
Diseo evolutivo
208
Diseo evolutivo
Gestor
Extraccin
Interfaz
Cuenta
Extraccin
Monedero
Gestor
Interfaz
Cuenta
Extraccin
Monedero
209
Diseo evolutivo
<- 1
<- 2
<- 3
oGestorExtracciones=GestorExtracciones.dameSolitario()
;
oGestorExtracciones.agrega(this);
}
}
}
1-> public class Extraccion implements Serializable{
Al decir que la clase Extraccion implementa la interfaz Serializable,
se est se consigue la capacidad para transformar el estado completo
de un objeto en una secuencia de bytes, y poder crearlo nuevamente
leyendo la secuencia de bytes correspondientes. Esta cualidad nos
permite, entre otras cosas, que un objeto pueda ser guardado y ledo
de un archivo de objetos.
Es importante observar que esta interfaz no define mtodos,
simplemente indica que la serializacin es permitida.
210
Diseo evolutivo
211
Diseo evolutivo
:Extraccin
oInterfaz
Extraccin
oGestor
Extracciones
oTarjeta
:Cuenta
oGestor
Cuentas
oMonedero
trabaja
dameImporte
dameIdCuenta
Dame(idCuenta)
autoriza(importe)
entrega(importe)
resta(importe)
agrega(me)
Diseo evolutivo
213
Diseo evolutivo
esencia, y despus ampliarlo de forma natural. Insistimos, siempre que no se rebasen los
lmites que provoquen cambios cualitativos.
Tarjeta
Gestor
Interfaz
Gestor
Extraccin
Cuenta
Monedero
214
Diseo evolutivo
<- 1
<- 2
oGestorExtracciones=GestorExtracciones.dameSolitario();
oGestorExtracciones.agrega(this);
}
}
1-> oTarjeta=Tarjeta.dameSolitario();
215
Diseo evolutivo
Solitario.
216
Diseo evolutivo
oLector
Tarjeta
oControl
Acceso
oInterfaz
ControlAcceso
{el siguiente
objeto}
trabaja
trabaja
damePin
damePin
trabaja
Lector
Tarjeta
Interfaz
Control
Acceso
{Clase
siguiente}
217
Diseo evolutivo
<- 1
<- 2
<- 3
if (pinTarjeta.compareTo(pinControl)==0)
System.out.println("Autorizado");
}
218
Diseo evolutivo
:Extraccin
oInterfaz
Extraccin
oGestor
Extracciones
oTarjeta
:Cuenta
oGestor
Cuentas
oMonedero
trabaja
dameImporte
dameIdCuenta
Dame(idCuenta)
autoriza(importe)
entrega(importe)
resta(importe)
agrega(me)
oLector
Tarjeta
oControl
Acceso
oInterfaz
ControlAcceso
trabaja
trabaja
damePin
damePin
trabaja
219
{el siguiente
objeto}
Diseo evolutivo
220
Diseo evolutivo
oControl
Acceso
oInterfaz
ControlAcceso
oExtraccion
oInterfaz
Extraccion
oGestor
Extracciones
oTarjeta
oCuenta
oGestor
Cuentas
oMonedero
trabaja
trabaja
damePin
damePin
trabaja
dameImporte
dameIdCuenta
dame(idCuenta)
autoriza(importe)
entrega(importe)
resta(importe)
agraga(me)
221
oLector
Tarjeta
oControl
Acceso
oInterfaz
ControlAcceso
Diseo evolutivo
oExtraccion
oInterfaz
Extraccion
oGestor
Extracciones
oTarjeta
oCuenta
oGestor
Cuentas
oMonedero
trabaja
trabaja
damePin
damePin
trabaja
dameImporte
dameIdCuenta
dameIdCuenta
dame(idCuenta)
autoriza(importe)
entrega(importe)
resta(importe)
agraga(me)
acceso
extraccin
222
Diseo evolutivo
oControl
Acceso
oInterfaz
ControlAcceso
oExtraccion
oInterfaz
Extraccion
oGestor
Extracciones
oTarjeta
oCuenta
oGestor
Cuentas
oMonedero
trabaja
trabaja
damePin
damePin
trabaja
dameImporte
dameIdCuenta
dame(idCuenta)
autoriza(importe)
entrega(importe)
resta(importe)
agraga(me)
223
Diseo evolutivo
224
Diseo evolutivo
ACCESO
oLector
Tarjeta
oControl
Acceso
EXTRACCION
oInterfaz
ControlAcceso
oTarjeta
:Extraccion
oInterfaz
Extraccion
oGestor
Extracciones
oCuenta
oGestor
Cuentas
oMonedero
trabaja
trabaja
damePin
dameIdCuenta
valida
damePin
damePin
trabaja
dameImporte
dameIdCuenta
dame(idCuenta)
autoriza(importe)
autoriza(importe)
entrega(importe)
resta(importe)
agraga(me)
225
Diseo evolutivo
oLector
Tarjeta
oControl
Acceso
EXTRACCION
oInterfaz
ControlAcceso
oTarjeta
:Extraccion
oInterfaz
Extraccion
oGestor
Extracciones
oCuenta
oGestor
Cuentas
oMonedero
trabaja
trabaja
damePin
dameIdCuenta
valida
damePin
damePin
trabaja
dameImporte
dameIdCuenta
dame(idCuenta)
autoriza(importe)
autoriza(importe)
entrega(importe)
resta(importe)
agraga(me)
226
Diseo evolutivo
Lector
Tarjeta
Gestor
Interfaz
Tarjeta
Extraccin
Gestor
Cuenta
Interfaz
Monedero
Control
Acceso
227
Diseo evolutivo
oLector
Tarjeta
oControl
Acceso
oTarjeta
oInterfaz
ControlAcceso
{el sigiuente
objeto}
trabaja
trabaja
damePin
dameIdCuenta
valida
damePin
damePin
trabaja
228
Diseo evolutivo
oTarjeta = Tarjeta.dameSolitario();
pinTarjeta = oTarjeta.damePin();
oInterfazControlAcceso = new InterfazControlAcceso();
pinControl = oInterfazControlAcceso.damePin();
if (pinTarjeta.compareTo(pinControl)==0)
System.out.println(Autorizado);
<- 1
}
1-> oTarjeta =Tarjeta.dameSolitario();
En esta lnea se solicita el nico objeto de la clase Tarjeta. El
mismo objeto que recibe Extraccin cuando lo solicita. En esta
versin el objeto Tarjeta es el responsable del pin del cliente.
Falta por incluir la alternativa de No Autorizado
Lector
Tarjeta
{Clase objeto
siguiente}
Tarjeta
Interfaz
Control
Acceso
229
Diseo evolutivo
MUNDO EXTERIOR
Base de Datos
ACCESO
EXTRACCIN
Gestor
Extracciones
Gestor
Cuentas
Cuenta
Tarjeta
Extraccin
Control
Acceso
Lector
Tarjeta
Interfaz
Control
Acceso
Inferfaz
Extraccin
Monedero
pin
importe
Lector
Tarjeta
Monedero
dinero
tarjeta
MUNDO EXTERIOR
Usuario
230
Diseo evolutivo
Las clases interiores constituyen el ncleo del mecanismo del cajero, dividido en
dos secciones: el acceso y la extraccin, conectadas a travs de una clase comn.
El aislamiento del ncleo, respecto al mundo exterior, lo protege de los cambios,
mantiene su estabilidad. Pero adems, esta separacin permite un tratamiento
relativamente independiente de las interfaces que puede ser beneficioso.
La distincin de las secciones facilita la comprensin del sistema, reduce su
complejidad, porque permite la descripcin del sistema slo en trminos de sus
componentes y de la relacin que hay entre ellos. Un mecanismo de acceso y otro de
extraccin de dinero, sin tener que entrar en detalles de cada uno. Si no distinguimos
las secciones tendramos que describir el sistema dando todas sus clases y relaciones. La
introduccin de las secciones reduce la diversidad y adems, abre el camino para la
reutilizacin de mecanismos, fundamentalmente como ideas.
231
Diseo evolutivo
oInterfaz
Extraccin
:Extraccin
oGestor
Extracciones
oTarjeta
:Cuenta
oGestor
Cuentas
oMonedero
trabaja
dameImporte
dameIdCuenta
Dame(idCuenta)
autoriza(importe)
entrega(importe)
resta(importe)
agrega(me)
232
Diseo evolutivo
Ejercicio
Disear el diagrama de secuencia del ingreso de dinero. Nuestro cliente desea
que el ingreso no produzca un aumento en el saldo hasta que una persona del banco
valide la cantidad de dinero ingresada. Un ingreso automtico a cargo del sistema,
hubiese sido ms simtrico con extraccin, pero la decisin de nuestro cliente fue
distinta.
233
Diseo evolutivo
oInterfaz
Ingreso
oIngreso
oGestor
Ingresos
oTarjeta
oCuenta
trabaja
dameImporte
dameIdCuenta
dame(idCuenta)
registra(importe)
agrega(me)
234
oGestor
Cuentas
Diseo evolutivo
Tarjeta
Interfaz
Gestor
Ingreso
Cuenta
235
Diseo evolutivo
<- 1
<- 2
<- 3
<- 4
<- 5
}
1-> fecha=new Date();
Al igual que en Extraccin, al crear una instancia de la clase
Ingreso se asigna al atributo fecha la fecha actual del sistema.
2-> oInterfazIngreso= new InterfazIngreso();
Se pide la creacin de la interfaz correspondiente al Ingreso.
3-> oTarjeta=Tarjeta.dameSolitario();
Se pide el nico objeto Tarjeta del sistema.
4-> oGestorCuentas=GestorCuentas.dameSolitario();
Se obtiene el nico objeto GestorCuentas del sistema.
5-> oGestorIngresos=GestorIngresos.dameSolitario();
El objeto GestorIngresos, se implementa tambin usando el patrn
Solitario. Aqu se pide su nica instancia.
236
Diseo evolutivo
ACCESO
EXTRACCI
ON
EXTRACCIO
N
ACCESO
INGRESO
237
Selector
Diseo evolutivo
Operacin
Ingreso
Extraccin
238
oLector
Tarjeta
Diseo evolutivo
oControl
Acceso
oTarjeta
oInterfaz
ControlAcceso
trabaja
{el sigiuente
objeto}
oSelector
oInterfaz
Selector
OSELECT
OR
trabaja
OTARJ
ETA
damePin
dameIdCuenta
trabaja
damePin
damePin
trabaja
dameOperacin
trabaja
239
FIGURA 34.
Diseo evolutivo
oInterfazSelector=new InterfazSelector();
operacion=oInterfazSelector.dameOperacion();
operacion.trabaja();
<- 1
<- 2
<- 3
<- 4
}
1-> Operacion operacion;
operacin es una variable que pertenece a la clase abstracta
Operacion. Esta variable puede contener objetos que pertenezcan a
cualquier subclase de la clase Operacin; en particular objetos de la
clase Ingreso o de la clase Extraccion.
2-> oInterfazSelector=new InterfazSelector();
En esta lnea se crea el objeto interfaz oInterfazSelector.
3-> operacion=oInterfazSelector.dameOperacion();
oInterfazSelector solicita al usuario la operacin deseada y retorna
el objeto correspondiente a la operacin seleccionada por el usuario.
4-> operacion.trabaja();
En esta lnea de cdigo, si el usuario seleccion una operacin, el
selector da la orden a la operacin para que trabaje. El atributo
operacin puede ser de la clase Extraccin o de la clase Ingreso.
240
Diseo evolutivo
Lector
Tarjeta
Tarjeta
Interfaz
Interfaz
Control
Acceso
Gestor
Operacin
Selector
Cuenta
trabaja
Gestor
Gestor
Interfaz
Interfaz
Extraccin
Ingreso
trabaja
trabaja
{Otra
Operacin}
Monedero
Observe que no existe ningn objeto cajero. El software del cajero funciona sin
una definicin explcita. Este es uno de los recursos de la orientacin a objetos que
hemos empleado en el diseo para facilitar su evolucin. Empezamos con la extraccin,
despus aadimos el acceso y por ltimo, agregamos el ingreso sin tener que modificar
ninguna definicin, porque no exista. El sistema cumple su funcin sin necesidad de
una definicin explcita de un cajero dentro del cdigo
241
Diseo evolutivo
Un objeto cajero, para definir el sistema, conteniendo los objetos del diseo no
desempea un papel relevante en el software. De tenerlo, habra que modificarlo cada
vez que se cambiara algo.
Otra observacin interesante es que podemos tener una visin integral de la
estructura del sistema con el diagrama de clases. Pero con los diagramas de secuencia,
slo tenemos trozos del comportamiento del sistema, como escenas sueltas de una obra
de teatro.
2. 6 Recapitulemos
El mtodo de trabajo ha sido considerar una situacin simple y despus
enriquecerla. Por ejemplo, una extraccin y despus, varias extracciones.
Cuando aumentamos la capacidad cuantitativa de nuestro sistema software, para
operar con ms de una extraccin y con ms de una cuenta, slo tuvimos que aadir
piezas de software, objetos y cdigo, que encajaron sin dificultad en el mecanismo
existente. Las exigencias cuantitativas del entorno se pudieron resolver con cambios
cuantitativos en el sistema, gracias a la aplicacin del principio de ocultamiento de
informacin.
Los diseos deben mostrar esta cualidad, siempre que los cambios cuantitativos
no impliquen cambios cualitativos. Como hemos dicho, manejar diez datos es
cualitativamente distinto de manejar un milln. Un salto cuantitativo de ese orden debe
provocar cambios sustanciales en el mecanismo, que no se resuelven solamente
aadiendo ms piezas de software. Pero, mientras que no ocurran tales cambios nuestro
software debe evolucionar de manera simple.
Cuando el entorno exigi agregar la funcin del control de acceso se produjo un
cambio cualitativo. Hubo que hacer modificaciones en el software precedente para
acoplarlo a la funcin de acceso. En general, los cambios cualitativos en el problema
provocan cambios cualitativos en la solucin software. Se deben aprovechar tales
cambios para mejorar las cualidades del sistema.
Algo parecido sucedi con la funcin ingreso, hubo que modificar el software
existente. Cambi la geometra del sistema al crearse un punto de bifurcacin.
242
Diseo evolutivo
243