Professional Documents
Culture Documents
Introduccin
El mtodo Mostrar() es
Abstracto, ya que
todos los subtipos de
Pato se ven de manera
distinta
Ca d a
su
respon btipo es
s
imple able de
m ent a
el
mtod
o M os
t r a r ()
Lo que queremos
Todas
la
subcla s
s e s he
redan
Volar(
)
agreg
Lo que Joe
s de Pato
Otros tipo
Qu pas?
Joe nunca not que no
todas las subclases de
pato deben Volar.
Cuando Joe agreg
nuevo comportamiento
a la superclase,
tambin estaba
agregando
comportamiento no
apropiado a las
subclases. Ahora tiene
objetos inertes volando
en el juego.
Una
actualizaci
n localizada
al cdigo
caus un
efecto
secundario
no local
(patos de
goma
voladores)
Qu pas?
to
amien
t
r
o
p
el com perclase,
Poner
su
) en la d de vuelo
(
r
a
l
o
V
da
habili
,
le dio S los patos no
e
O
u
D
a TO
a los q
o
d
n
e
incluy n hacerlo
a
deber
Patos de goma no
graznan, el
comportamiento es
sobrescrito a Chillar
Qu pas?
OK, hay una pequea
falla en mi diseo. No
se por qu no le
pueden llamar una
nueva funcin. Es
simptico
Ejercicio
De las siguientes opciones elija cules serian las
desventajas de utilizar herencia en el ejemplo anterior
A. El cdigo se duplica en las subclases
B. Cambios en tiempo de ejecucin son difciles
C. No podemos hacer que los patos bailen
D. Se complica obtener conocimiento del comportamiento
de todos los patos
E. Los patos no pueden volar y graznar al mismo tiempo
F. Los cambios en el cdigo podran afectar a otros patos sin
intencin
Es la idea ms tonta que se te
ha ocurrido. Cdigo
Duplicado. Si creas que
sobrescribir unos cuantos
mtodos era un error, cmo te
sentirs cuando tengas que
cambiar el comportamiento de
vuelo de las 48 subclases de
pato?
EL CAMBIO
Utilizar un espejo para ver la respuesta
La constante en desarrollo de
software
No importa
No importa
No importa
No importa
aplicacin
dnde trabajes
qu construyes
qu lenguaje utilices
qu tan bien diseada este una
Ejercicio
Muchas cosas pueden crear cambios. Pensemos
en razones que hayan disparado este
comportamiento en nuestras aplicaciones. Ej:
Mis clientes o usuarios decidieron que queran algo
diferente o nueva funcionalidad
Mi compaa decidi comprar una nueva base de datos y
tambin est comprando datos de proveedores en otro
formato. Argh!
Enfocarse en el problema
Ahora sabemos que el uso de la
herencia no funcion muy bien, ya que
el comportamiento de pato sigue
cambiando en todas sus subclases y no
es apropiado que todas las subclases
tengan esos comportamientos.
Las Interfaces sonaban prometedoras al
principio solo patos que deban volar
Volarn- pero como en las interfaces no
se implementa cdigo, no existe la
reutilizacin de cdigo.
Enfocarse en el problema
Y esto quiere decir, que cuando se
necesite modificar un comportamiento,
estamos forzados a rastrear y
cambiarlo en todas las diferentes
subclases donde ese comportamiento
se haya definido (probablemente
introduciendo nuevos errores en el
camino!)
Por suerte, hay un principio de diseo
justamente para estas situaciones
Principio de diseo
Identifica los aspectos de
tu aplicacin que varan y
sepralos de aquellos que
permanecen igual
Enfocarse en el problema
En otras palabras, si tenemos algn aspecto de nuestro
cdigo que est cambiando, por ejemplo nuevos
requerimientos, entonces sabremos que existe un
comportamiento que necesita ser extrado y separado de
todo lo que no cambia.
Otra manera de pensarlo es: tomar las partes que varan
y encapsularlas, para que despus se puedan alterar
o extender sin afectar a las partes que no varan.
A pesar de ser un concepto simple, forma la base de casi
todo patrn de diseo. Todos los patrones proveen una
manera de dejar que algunas partes de un sistema varen
independientemente de las dems.
Varias implementaciones
de comportamientos
vivirn aqu
Ahora
V
cada u olar y Grazn
n
a
conjun a tiene su p r
ropio
to de
clases
Principio de diseo
De ahora en adelante,
los comportamientos
de un Pato van a vivir
en una clase separada
una clase que
implementa una
interfaz de
comportamiento
particular.
De esa manera, las
subclases de Pato no
necesitarn conocer
ningn detalle de
implementacin para
Supertipo Abstracto
(puede ser una clase
abstracta o una
interfaz
Implementaciones
concretas
Declarar la
variable p
como tipo
Perro (una
implement
acin conc
de Animal)
reta
nos hace c
odificar a u
implement
na
acin conc
reta a la
fuerza
No sabemos QU
animalsea todo lo
que nos importa es
Animal();
que sepa hacer un
sonido
Esta es la
implementacin de
vuelo para todos los
patos que tienen
alas
Y esta es la
implementacin
para los patos que
no vuelan
para el
comportamiento de
graznido
r que
Es deci
mos los
e
n
e
t
b
o
ios de
sin la
benefic
N
I
C
A
IZ
on la
c
REUTIL
e
n
e
i
ue v
carga q
ia
herenc
Ejercicio
Usando el diseo anterior, qu tenemos que
hacer si necesitamos volar con propulsor?
Una clase que podra utilizar el comportamiento
graznar
Integrando el comportamiento de
Pato
La clave es que un Pato ahora
delegar sus comportamientos de
vuelo y graznido, en lugar de usar
mtodos definidos en la misma clase
Pato ( o subclase)
Integrando el comportamiento de
Pato Primer Paso
Primero agregamos dos variables a la clase Pato
llamadas Vuelo y Graznido como interfaces (no
implementaciones concretas)
Cada objeto pato le dar valor a estas variables
polimrficamente para referenciar el comportamiento
especfico que desee en tiempo de ejecucin (volar con
alas, chillar, etc)
Tambin quitamos los mtodos volar y graznar de la clase
Pato (y cualquier subclase) ya que hemos movido estos
comportamientos a las clases comportamiento de vuelo y
graznido
Reemplazaremos los mtodos Volar y Graznar en la clase
Pato con dos mtodos similares llamados IniciarGraznido
e IniciarVuelo(), luego veremos cmo los utilizaremos
Integrando el comportamiento de
Pato Primer Paso
Las variables que
representan
comportamiento son
declaradas como
comportamientos de
tipo INTERFAZ
Estos mtodos
reemplazan a
Volar() y
Graznar()
Integrando el comportamiento de
Pato - Segundo
Implementamos los mtodos
Para graznar, un Pato solo le permite al objeto referenciado en la
variable que haga la operacin
No importa que tipo de objeto sea, nicamente nos interesa
que sepa graznar
Cada Pato tiene una referencia a
algo que implementa la interfaz
IGraznido
En lugar de manejar el
comportamiento de Graznar por si
mismo, el objeto Pato delega ese
comportamiento al objeto
referenciado por el
comportamiento IGraznido
Integrando el comportamiento de
Pato - Tercero
Ok, es hora de preocuparnos cmo se asignan los valores
de las variables Vuelo y Graznido
Un Pato Gargantilla
utiliza la clase
GraznarNormalmente
para manejar sus
graznidos, por eso
cuando la operacin
IniciarGraznido() es
llamado, la
responsabilidad es
delegada al objeto
GraznarNormalmente
y obtenemos un hermoso
graznido
Integrando
Entonces el graznido de un pato colorado es tan real
como el de cualquier pato, no es un chillido, no es un
silencio. Entonces qu pas aqu?
Cuando un PatoColorado es instanciado, su constructor
inicializa su variable de comportamiento de graznido
heredada a una nueva instancia de
GraznarNormalmente (que es una implementacin de
IGraznido)
Lo mismo es cierto para el comportamiento de
vuelo
Ejercicios
Crear y compilar la clase Pato y una clase que herede
de ella (Pato Gargantilla por ejemplo)
Crear y compilar las interfaces de comportamiento y
dos implementaciones para vuelo y tres para graznido
Crear una clase de prueba donde se compruebe el
cdigo.
Darle un valor de forma dinmica a una prueba (vuelo o
graznido)
Comportamiento encapsulado
to s
n
e
mi
a
ort n
p
com os so
s
s
o
Est oritm iable
b
g
al rcam
inte
Principio de diseo
Favorecer a la composicin
sobre la herencia
Maestro y Estudiante
Maestro: Saltamontes, dime qu has aprendido de las
maneras Orientadas a Objeto.
Estudiante: Maestro, he aprendido que la promesa de
la orientacin a objeto es la reutilizacin.
Maestro: Saltamontes, continua
Estudiante: Maestro, a travs de la herencia todas las
cosas buenas pueden ser reutilizadas y de esa manera
podemos cortar el tiempo de desarrollo como cortar
bamb en el bosque.
Maestro: Saltamontes, se desperdicia ms tiempo en
el cdigo antes o despus de que se complete el
desarrollo?
Estudiante: La respuesta es despus, Maestro.
Siempre gastamos ms tiempo manteniendo y
cambiando el software que al inicio.
Maestro: Entonces saltamontes, debera el esfuerzo
enfocarse en la reutilizacin por encima de la
mantenibilidad y extensibilidad?
Estudiante: Maestro, yo creo que hay verdad en eso.
Maestro: Puedo ver que an tienes mucho que
aprender. Quiero que vayas a meditar sobre la herencia
Ejercicio
Reclamo es un dispositivo que los cazadores utilizan
para imitar el llamado de los patos (graznido). Cmo
implementaramos un reclamo que NO herede de la
clase Pato?
El patrn Strategy
Rompecabezas
En el siguiente ejemplo
encontraremos clases e
interfaces desordenadas
pertenecientes a un juego de
aventuras, clases de
personajes y comportamiento
de armas que cada personaje
puede usar en el juego. Cada
personaje puede hacer uso de
un arma a la vez, pero puede
hacer el cambio de armas en
cualquier momento durante
el juego. Tu debes arreglar
todo
Herencia
Interfaz
Tiene un
Rompecabezas
Flo
Dame un QJ. En
Blanco, y Blanco y
negro, un Jack
Benny, una radio, y
un bote de casa, un
caf regular y una
parrilla
Rick, por qu no
dices solamente
que ests utilizando
el patrn Observer
Exactamente. Si te
comunicas en
patrones, entonces
otros desarrolladores
sabrn inmediata y
precisamente el
diseo que estas
describiendo.
Ejercicio
Puedes pensar en vocabularios que sean usados en
otros lugares?
Que cualidades son comunicadas?
Que cualidades se comunican junto a los nombres de
los patrones?
Que cualidades se comunican cuando decimos patrn
strategy?
El poder de un vocabulario
compartido
Cuando nos comunicamos utilizando patrones,
hacemos ms que solamente compartir un LINGO.
r los varios
e que los
ic
d
implementa
s
o
n
to
atos es
ido
nuestros p
pato han s
l
e
d
s
to
n
ie
de clases
m
s
o
ta
p
r
u
o
r
p
g
m
o
io
c
op
s en sus pr
o
d
la
u
s
andidos y
p
p
a
x
c
e
e
en
t
n
e
n
s ser fcilm
de ejecuci
o
p
m
e
que puede
ti
n
e
, inclusive
cambiados
ario.
si es neces
o
nes de dise
io
s
u
c
is
d
o
uniones
dan
Cuntas re
e se degra
n?
u
q
o
id
d
n
lementaci
p
im
e
d
hemos ate
s
e
ll
te en deta
rpidamen
compartir
a
a
z
n
ie
m
co
s
stro equipo
e
u
n
en trmino
o
d
s
n
ia
a
c
n
Cu
ie
r
e
de
eo y exp
comunidad
a
n
u
ideas de dis
e
y
u
s, se constr
de patrone
patrones
usuarios de
Un montn de patrones
Nuestro
CEREBRO
Nuestro cdigo,
ahora nuevo y
mejorado con
patrones de
diseo
Patrones no
son ms que
la utilizacin
de principios
de diseo
OO
Un error muy
comn,
Saltamontes,
pero es ms sutil
que eso. Tienes
mucho que
aprender
Desarrollador
Escptico
Gur amistosa de
patrones
OO Bsico
n
Abstracci
miento
Encapsula
mo
Polimorfis
Herencia
OO
Principioslo que vara
r
re
Encapsula
osicin sob
p
m
o
c
r
ri
Prefe
no
herencia
a interfaz,
n
u
a
r
a
m
Progra
entacin
m
le
p
im
a
n
u
OO
itmos,
Patrones fine una familia de algorce
tegy de
, y los ha
S t ra
no de ellos
u
a
d
a
c
la
u
que los
ja
e
d
y
encaps
g
e
t
bles. Stra
ente de los
intercambia en independientem
var
algoritmos
utilizan
s
lo
e
u
q
s
cliente
Sumario
Conocer lo bsico de OO no te hace un buen diseador
OO
Los buenos diseos OO son reusables, extensibles y
mantenibles
Patrones te ensean a crear sistemas con buenas
cualidades de diseo OO
Patrones son Experiencias comprobadas OO
Patrones no te dan cdigo sino soluciones generales a
problemas de diseo
Sumario
No fueron inventados, fueron descubiertos
Patrones y principios administran el problema del
cambio en el software
Patrones permiten que partes de un sistema varen
independientemente de otras
Buscamos tomar lo que varia en un sistema y lo
encapsulamos
Patrones provee un lenguaje compartido