Documentos de Académico
Documentos de Profesional
Documentos de Cultura
'Discusiones PDF
'Discusiones PDF
Curso 2005/2006
Cuaderno de discusiones de Patrones de Diseo: Preguntas y
respuestas de la lista de discusin de la asignatura
Este cuaderno contiene las preguntas y respuestas de la lista de discusin
(http://servidor/mailman/listinfo/isw2-dist) de la asignatura con algunos comentarios de
los profesores.
ndice
Boletn 3.1: Introduccin a los Patrones de Diseo.......................................................... 3
Boletn 3.2: Patrones de Asignacin de responsabilidades (GRASP)............................ 12
Boletn 3.3.1: Faade y Template Method ..................................................................... 18
Boletn 3.3.2: Patrones Factory ...................................................................................... 26
Boletn 3.3.3: Strategy y Adapter ................................................................................... 29
Boletn 3.3.4: Decorator ................................................................................................. 32
Boletn 3.1: Introduccin a los Patrones de Diseo
Cuestin 1: Enuncie las diferencias entre modelos de anlisis y diseo
1) El modelo de anlisis es un modelo conceptual cuya parte esttica est definida por
diagramas de clases y cuya parte dinmica por diagramas de secuencia,..., mientras que
el diseo aunque tambin se representa mediante diagramas de clases estos estn
orientados a la implementacin.
3) Los modelos de anlisis son modelos conceptuales que representan la situacin del
mundo real que se quiere sistematizar: Modelo esttico de clases (diagrama de clases),
modelo dinmico (casos de uso, diagramas de secuencia) y modelo funcional
(diagramas de actividad). Los de diseo son modelos para la implementacin:
Principios GRASP, PPDD,...
Los modelos de anlisis muestran conceptos del mundo real, mientras que los de
implementacin introducen conceptos artificiales que son necesarios por usar una
implementacin orientada a objetos. Las implementaciones orientadas a objetos
permiten asignar responsabilidades (mtodos) a conceptos que en el mundo real no
seran activos y por tanto, capaces de realizarlas. Esta es otra de las diferencias: en los
modelos de clases de anlisis los objetos no tienen responsabilidades, mientras que en
diseo s.
Adems, dado que en la mayora de los casos hay que aadir conceptos artificiales para
conseguir un buen diseo, los modelos de clases de anlisis suelen tener menos clases
que los de diseo.
3) Adems de los mencionados anteriormente por los compaeros, otro factor fue la
necesidad de transmitir conocimiento debido a que en el diseo la experiencia es muy
importante y se observo que se utilizaban recetas para los problemas habituales para
no estar reinventando la rueda continuamente. Por lo que surgieron como una forma de
poder transmitir dichas recetas.
Correcto
Creo que preguntan esta definicin porque los "problemas" definidos en los patrones no
son siempre problemas. Es decir, creo que los patrones no resuelven problemas como
tales, simplemente hacen que no aparezcan problemas debidos a un mal diseo,
aplicando para ello la experiencia de muchos diseadores.
Tienes razn en parte. Es cierto que la idea es intentar evitar problemas, pero realmente
si identifican un problema. Por ejemplo, el problema de tener un cdigo repetido en
varios sitios pero presentando pequeas diferencias (para el caso del template method).
Con respecto a la solucin, entre otras cosas se propone un diseo genrico (diagrama
de clases), que puede ser adaptado a cada caso (esto lo ejemplificamos en clase con los
patrones de costura y los ajustes que se le hacan).
Solucin son los pasos a seguir, como una especie de receta para resolver un problema.
Ms que pasos a seguir, yo lo veo como una serie de ideas que debes tener claras para
aplicarlas en caso de ser necesarios.
De acuerdo en esto (hay que conocer las ideas para poder aplicarlas). Pero debes ser
capaz de llevar estas ideas a un diseo (diagrama de clases). Lo de las ideas estara ms
en concordancia con los GRASP, no tanto con los patrones. Aunque repito, en los dos
casos esas ideas o principios hay que manejarlos.
1) Pues que suelen ofrecer soluciones a problemas recurrentes (suelen aparecer mucho)
y estos son solucionados de una forma abstracta, por lo que "puede utilizarse un milln
de veces sin hacer dos veces lo mismo"
2) Para empezar la solucin descrita en los patrones de diseo es una solucin general
que ha de ser especificada para poder ser aplicada, con lo que se puede adaptar a
muchas situaciones concretas favoreciendo as la reutilizacin.
En segundo lugar es digno de resaltar que se presenta una solucin que es (o debe serlo)
independiente de la implementacin (se trata de reutilizar conocimiento para resolver un
problema, no software).
El hecho de que aparezcan reseadas las consecuencias del uso del patrn (ventajas e
inconvenientes) y la aplicabilidad (cundo se puede usar), hace que sea posible mejorar
el mantenimiento y facilita saber en qu situaciones el patrn ha demostrado ser til
para resolver un determinado problema.
Perfecto. El punto clave es que sea una definicin general (abstracta). Eso hace que
aumente las posibilidades de poder aplicarse.
3) Los patrones de diseo son un par problema/solucin, por tanto la descripcin del
problema nos ayudara a saber cuando podemos utilizar un patrn de diseo. Un ejemplo
concreto seria el patrn de diseo singleton, segn la plantilla de descripcin de GOF, la
aplicabilidad nos dice cuando lo podemos usar.
2) En los patrones de diseo la solucin aparece como una estructura de clases con
asignaciones de responsabilidad, por ello se aplica en los diagramas de clases en la
etapa de diseo (la asignacin de responsabilidades es una de las tareas ms importantes
del diseo).
Se aplica tanto a los diagramas de clase de anlisis (justo al comenzar la fase de diseo),
como a los diagramas de clases de diseo para mejorarlos/aumentarlos, y a al cdigo de
aplicaciones existentes a la hora de refactorizarlo para mejorar su diseo.
1) S es posible aplicar un patrn de forma aislada (pero siempre tenemos que tener en
cuenta los principios evaluativos), como ejemplo podemos encontrar el ejemplo de los
montaditos del patrn template method descrito en clases de teora que no necesitaba de
otro patrn. Sin embargo, no es habitual que los patrones de diseo sean aplicados de
forma aislada, es por ello que existen relaciones entre estos las cuales son descritas en
sus plantillas de descripcin.
Perfecto
Cuestin 8: Indique las razones por las que el diseo es una actividad difcil.
1) Para empezar en la etapa de diseo aparecen grandes rupturas entre el mundo real y
la analoga que representamos en nuestro diagrama de clases, asignando tareas y
responsabilidades a objetos inanimados.
Por otro lado existe una necesidad de obtener un equilibrio entre los distintos requisitos
no funcionales que aparecen en el documento de anlisis.
Perfecto
Deberamos aadir que esto es as debido a que intentar cumplirlos cuando el diseo
esta avanzado es muy complicado o imposible.
Cuestin 10: Discuta sobre la madurez de la Ingeniera del Software respecto de las
ingenieras clsicas y otras profesiones.
Aunque los patrones de diseo surgen precisamente para dotar de mayor madurez a la
ISW an no se ha conseguido eliminar completamente la situacin actual en cuando al
diseo se refiere, casi ms cercana al arte que a otras ingenieras.
A pesar de todo poco a poco se dan los pasos necesarios para mejorar la situacin.
Sin embargo en otros aspectos que caen tambin dentro del mbito de la ISW los pasos
conseguidos hacia una etapa de madurez plena son ms espectaculares
(Vase planificacin, costes y otros aspectos estudiados en ISW3).
OK. Animo a que el resto de alumnos hicierais el esfuerzo de pensar sobre esto.
1) El nombre del patrn debe dar una idea primera de qu hace, qu se consigue al
aplicar el patrn.
Evita que alguno de los diseadores que no conozca bien esa parte del diseo cree
varias instancias de una clase.
Perfecto
2) Bien, tengo clara lo que es la idea de biblioteca, que es un conjunto de clases para ser
reutilizados, que usamos en nuestra aplicacin. Es decir, nuestra aplicacin llama a los
mtodos de la biblioteca. Sin embargo, el concepto de framework no lo tengo claro del
todo. Cuando lo veo en las prcticas lo entiendo, en el caso de Login. Pero en la teora
dice que es un "Conjunto de clases parcialmente funcional (no es una aplicacin) para
un dominio de aplicacin" Que es un dominio de aplicacin? Y que es lo que le falta
al framework para ser aplicacin?
Cuestin 18: Indique la diferencia entre idiom y patrn de diseo; discuta sobre las
situaciones en las que ambos pueden confundirse.
Un idiom no tiene por que ser de bajo nivel. Iterator no lo es. Lo que realmente los
distingue es que el idiom supone una forma especial de escribir el cdigo. Aun as, en
muchas ocasiones no existe una frontera clara y es cuestin de opiniones el caracterizar
algo como patrn o idiom.
A veces puede confundirse porque los patrones de diseo a veces aparecen muy ligados
a la implementacin y se incorporan como caractersticas de los lenguajes de
programacin.
Bien lo que dices.
Cuestin 19: Enuncie los antipatrones que conozca junto con una breve descripcin de
los mismos.
De cara al examen solo tenis que conocer los vistos en clase. Aunque no est mal que
hagis un poco de investigacin
*The blob: Una clase se convierte en una masa informe debido a tener un desorbitado
tamao convirtindose en un problema para el mantenimiento y la compresin.
- BLob (tambin conocido como God Object): Una clase gigantesca que hace de todo
(una amalgama de mtodos) mientras las dems apenas contienen datos, las
responsabilidades no estn distribuidas uniformemente.
Son clases que intentan hacerlo todo sin ayuda de otras clases (sin acoplarse con otras
clases). Como resultado requieren gran cantidad de mtodos y almacenar mucha
informacin.
* Poltergeists: Los objetos de una clase tiene un tiempo de vida muy corto.
- Poltergeists: Los objetos de una clase tienen una corta vida (aparecen y desaparecen
como un poltergeist) usadas usualmente para pasarle informacin a objetos de otra clase
(tpicos nombres de estas clases son manager_xxx o controlador_xxx).
- Copy & Paste: tpico de cuando ests aprendiendo algo nuevo y en lugar de intentar
hacerlo t mismo te dedicas a buscar cdigo por Internet, foros, libros o apuntes que
copias y utilizas sin llegar a entender realmente para, posteriormente, "adaptarlo" al
problema que tienes entre manos. Es normal que se produzca un palimpsesto de
distintos estilos, con cdigo superfluo, difcil de mantener, poco eficiente...
Bien
Bien
Boletn 3.2: Patrones de Asignacin de responsabilidades
(GRASP)
2) Pues que en el anlisis la preocupacin era atender a los requisitos mientras que en el
diseo se deben tener en cuenta principios como los GRASP
Demasiado incompleto.
1) Porque los sistemas informticos tienen que realizar funciones que no existen en el
mundo real como la creacin de un objeto, el acceso a una base de datos, etc.
El mayor problema que esto supone es que la relacin entre el mundo real y la
representacin creada en el documento de anlisis y diseo se separan.
Correcto.
1) Larman llama patrones a los GRASP porque la palabra patrn era una buzz-word,
algo llamativo y de moda. Pues en vez de patrones hubiera sido ms lgico usar el
nombre de principios.
Correcto.
2) Creo que los llama patrones siguiendo el concepto de patrn, ya que los GRASP se
aplican a un problema concurrente y aportan una especie de solucin, aunque no es una
solucin exactamente, sino mas bien un "consejo" que te permite obtener un buen
diseo
El nombre mas apropiado seria "principios", ya que como dijimos antes, los GRASPs
no permiten obtener una solucin tal cual, sino un diseo bueno indicando una serie de
pautas para conseguirlo.
Los problemas tratados por los principios son demasiado generales para considerarlos
patrones desde el punto de vista GOF. Ver la respuesta 1.
3) Los llama Patrones porque estn expresados o descritos como tales (par problema
solucin y dems puntos de la plantilla), pero hubiera sido mas correcto llamarlos
principios pues en ellos se basan e intentan darle solucin los dems patrones.
2) Primero de todo darlo a conocer "de verdad", es decir, describirlos de una manera
ms rigurosa. Hay que recordar que el diseo an se encuentra en una fase cercan al arte
por lo que a pesar de ser principios muy conocidos y aplicados, toda disciplina debe
contar con unos rigurosamente descritos y formalizados (que todo el mundo sepa de
qu se habla) para poder apoyarse en ellos. En el momento que Larman los introdujo es
cierto que eran conocidos, pero conocidos, por as decirlo, casi por ciencia infusa, de
una manera inconsciente y natural.
Las dos respuestas son correctas pero incompletas. Tendramos que aadir:
Que tambin se describen para que no sean reinventados/asimilados/redescubiertos una
y otra vez. De esta forma se conocen como un todo y nadie tiene duda de que es un
principio y que no lo es. Tambin se evita la definicin del mismo principio de varias
formas distintas como ocurra por ejemplo con variaciones protegidas que era definido
de varias formas: principio abierto/cerrado, principio de sustitucin de liskov, principio
de encapsulacin, no hables con extraos,...
1) Un principio evaluativo es aquel que el diseador debe aplicar cada vez que introduce
una modificacin en el diseo.
Hemos visto alta cohesin y bajo acoplamiento. La relacin que tienen ambos proviene
de ser principios contrapuestos. Es normal que una clase que presenta un alto
acoplamiento presente tambin una baja cohesin y viceversa.
Con respecto a la relacin: Es correcto pero es importante tener claro que esto no es
siempre as. Es decir, una clase con alto acoplamiento puede tener muy mala
cohesin. Lo que ocurre es que por regla general (insisto en que no siempre) cuando
intentamos bajar el acoplamiento se produce un empeoramiento de la cohesin si slo
aplicamos estos dos principios. Dado que si al intentar bajar el acoplamiento de dos
clases aadimos una tercera usando una indireccin y cuidamos la cohesin, esta no
tiene que verse comprometida. Un ejemplo de esto sera la aplicacin de un Simple
Factory para reducir el acoplamiento entre dos clases. De ah que se tengan que aplicar
siempre al hacer un cambio en el diseo.
2) Son principios que son tenidos en cuenta a la hora de evaluar una decisin de diseo.
Los principios evaluativos son bajo acoplamiento y alta cohesin. Son principios
opuestos por lo que se debe intentar encontrar un equilibrio entre ambos.
1) Yo creo que no, ya que siempre que apliquemos un GRASP estamos tomando una
decisin de diseo por lo que debemos tener en cuenta los principios evaluativos, y al
aplicar alguno de los principios evaluativos tenemos que tener en cuenta el otro ya que
como hemos dicho anteriormente estn directamente relacionados (son opuestos)
Correcto. Por ejemplo, al intentar reducir el acoplamiento sabemos que esto nos puede
empeorar la cohesin, por lo que tendremos que aplicar indireccin (para mejorar el
acoplamiento) y/o fabricacin pura (para mejorar la cohesin) para que el acoplamiento
y la cohesin permanezca a un buen nivel.
2) Pues yo dira que no, al ser principios de diseo deben ser tenidos todos en cuenta, no
tiene mucho sentido tener en cuenta unos principios y otros no si se desea obtener un
buen diseo, claro.
3) S, siempre que sea un GRASP que no tenga relaciones o dependencias con otros.
No, ya que hay que tener en cuenta varios GRASPs para obtener un buen diseo.
Adems, existen GRASPs que, al aplicarlos, afectan a otro GRASP, como por ejemplo,
Bajo Acoplamiento y Alta Cohesin pues al quitar responsabilidades a una clase y
delegarlas a otra, aumenta el acoplamiento. O viceversa, al eliminar clases para reducir
el acoplamiento, las responsabilidades de dichas clases van a otra de las clases con las
que estaba relacionada.
Correcto, pero siempre que no uses indirecciones/fabricaciones puras como hemos visto
antes
Cuestin 7: Cul es la tarea primordial que controlan los GRASP? Por qu es tan
importante esta tarea? Por qu no la hemos realizado en anlisis?
Con respecto al resto de preguntas: Supongo que cuando dices diseo quieres decir
anlisis. Concretando un poco lo que comentas, en el mundo del anlisis se hace un
modelo de conceptos (modelo conceptual) en el que existen conceptos inanimados
(facturas, productos,...) que no pueden asumir responsabilidades. Al pasar a diseo
orientado a objetos esta tarea es primordial para acercar el modelo del mundo real al de
la implementacin. En anlisis no se puede hacer puesto que se usan conceptos y no
clases de diseo y debido a que los conceptos inanimados no pueden asumir
responsabilidades.
1) Los cambios en el diseo de un elemento suelen afectar a otros elementos por ello
GRASP propone variaciones protegidas.
1)
- Aplicar de manera desmedida el principio experto en informacin nos lleva a tener
diseos que aumenten el acoplamiento y la duplicacin de cdigo (pensad en que cada
clase se tiene que guardarse a s misma en una BD).
- Aplicar de manera desmedida el principio alta cohesin nos lleva al anti-patrn clases-
algoritmos, lo que conlleva un aumento del acoplamiento (si mi clase hace algo
excesivamente especfico necesitar otras para llevar a cabo una tarea ms general).
Tambin nos puede llevar al antipatrn poltergeist donde los objetos aparecen y
desaparecen de manera incesante.
Correcto.
- Aplicar de manera desmedida variaciones protegidas puede llegar a hacer que el coste
de proteccin ante esas variaciones sea superior al de modificar un diseo.
Acoplamiento es una medida de la fuerza con que un elemento est conectado a, tiene
conocimiento de confa en otros elementos. Usualmente se dice que una clase es muy
acoplada si tiene muchas relaciones.
Ejemplo: sea una clase A con mtodos m1() y m2(), una clase B con mtodos n1() y
n2(), una clase C con un mtodo p() y una clase D. cualquier cambios en los mtodos de
B o C, afectara a la implementacin de los mtodos de A, por tanto, la clase A est muy
acoplada, asimismo sera muy difcil de reutilizar.
Aadir que el acoplamiento puede aparecer de muchas formas: parmetros en mtodos
de una clase que son objetos de otra, atributos de una clase que son referencias a objetos
de otra, devolver objetos de otra clase en un mtodo y crear variables locales en los
mtodos de una clase de objetos que son de otra clase.
Lo importante es ver que el acoplamiento se mide entre dos clases y que ste ser
desfavorable cuando exista un punto de variacin o cuando el acoplamiento de una clase
con el resto sea muy fuerte: mucha utilizacin de objetos de otra clase y/o acoplamiento
con varias clases al mismo tiempo.
Sea una clase C con mtodos m1(), m2(), ..., mk(), y algunos de ellos tienen una
funcionalidad de acceder por ejemplo, a una BD, entonces se podra delegar la
responsabilidad de acceso a la BD a otra clase denominada AccesoBD.
Esto no es un ejemplo de alta cohesin o baja, es una forma de solucionar. Alguien nos
manda un ejemplo de las dos situaciones que no sea el de clase?
Faltan cosas que estn detalladas en los apuntes. Alguien nos las manda y nos las
explica?
Boletn 3.3.1: Faade y Template Method
Cuestiones generales
Las palabras clave son: Simplificar pero para uno de los usos habituales del subsistema
(no para cualquier caso)
Bien.
2) Presentar una serie de plantillas de algoritmos, dichas plantillas constan de una parte
fija y una parte que deben implementar cada una de las clases cliente que quieran
utilizar las plantillas. De esta forma logramos reutilizar cdigo y favorecemos el
mantenimiento y entendimiento de los distintos algoritmos involucrados.
2)
- Simplifica el uso de un sistema complejo, abstrayendo la funcionalidad de ste.
- favorece la definicin de distintas capas para usar el sistema.
- desacopla las clases cliente de las clases del sistema (indireccin mediante la clase
fachada),
As mejora la portabilidad y aade proteccin de las clases clientes ante cambios en la
implementacin del sistema tras la fachada.
Correcto los dos, pero hay que tener en cuenta que al no impedir el uso directo del
subsistema, el desacoplamiento no es total y los cambios en el subsistema s pueden
afectar.
2)
- el comportamiento comn de varias clases se implementa una nica vez
- mejora la mantenibilidad
- es til para la creacin de bibliotecas y frameworks
1) Indireccin y controlador, este ultimo ya que los controladores suelen actuar como
puntos de entradas (fachadas) de la capa lgica. Por su puesto estara tambin
relacionado con los principios alta cohesin y bajo acoplamiento.
2)
- Indireccin (introducimos la clase fachada para bajar el acoplamiento)
- Controlador (separa la lgica del sistema de la interfaz que proporciona la fachada,
que adems suele ser comn a todos los clientes usando el patrn Singleton)
Correcto.
1) esta relacionado con el principio de hollywood, es decir "no nos llames, nosotros te
llamamos", este es el mismo principio que se aplica en los frameworks ya que al igual
que en aquellos, se dejan por definir algunos mtodos (mtodos hook), de manera que
despus es el cliente el que debe definirlos en su aplicacin concreta.
2)
- Estrategia (aunque cambia todo el algoritmo en lugar de una parte que se concreta)
- Fabricacin pura (la clase fachada no representa ninguna clase del dominio del
problema, es fabricacin de la mente y est creada especficamente para un fin
concreto).
Estrategia no es un principio y la fabricacin pura tiene como objetivo mejorar la
cohesin, por lo que no seran ninguno de estos.
La relacin proviene por la forma de llamar a los mtodos hook. Puesto que el
algoritmo aparece creado en la clase padre, es sta la que se encarga de llamar a los
mtodos de las clases hijas que aaden la funcionalidad necesaria para que el algoritmo
pueda ejecutarse (segn el principio de Hollywood)
Correcto, pero teniendo en cuenta que la fachada no evita el uso directo del subsistema.
Por lo que el desacoplamiento no es total.
3) Tambin el patrn Alta cohesin, pues las responsabilidades del cliente no han
cambiado, sin embargo, la fachada tiene muchas responsabilidades
Cuestin 8: Es posible aplicar los patrones tal y como se definen en los libros? Por
qu? Ponga un ejemplo.
1) En principio si seria posible, as vemos como en la practica 4 de la asignatura se
aplicaba el patrn Singleton exactamente igual a como se describa en su plantilla, sin
embargo no es lo normal, as pues muchas veces al adaptarlos a la situacin concreta ya
sea a causa de que se use junto con otros patrones, a causa de la implementacin
concreta, o para que se cumplan los diversos requisitos tanto funcionales como no
funcionales.
Cuestiones especficas
Cuestin 9: Indique las dos opciones para implementar un mtodo gancho (hook) en la
clase base de un mtodo plantilla.
1) No estoy seguro de que se trate de esto, pero supongo que el primer mtodo es el
tpico que se comenta de declarar en la clase padre un mtodo abstracto que se usa en el
mtodo plantilla, de modo que las clases hijas sean las que lo concreten e implementen.
Este segundo caso no es un template method tpico. Se os ensea para que veis que los
patrones no se pueden aplicar siempre como estn definidos en los libros. La respuesta
correcta para el segundo tipo de hook es la 3) y 4).
2) Por un lado podemos declarar el mtodo de forma abstracta de manera que fuera
despus el cliente que usara el mtodo plantilla el encargado de implementarlo. Por otro
lado podramos darle una implementacin por defecto de manera que el cliente podra
redefinir dicho mtodo, pero al contrario que suceda en el caso anterior, ya no seria
obligatorio, en este caso evidentemente el mtodo hook no podra ser declarado como
abstracto.
3) Yo tengo en mis apuntes que s se puede. Seran las dos formas de poder definir un
mtodo hook (mtodo abstracto o con implementacin por defecto).
Correcto tambin.
Cuestin 10: Indique que modificadores (public, protected, private, abstract, final)
deberan aplicarse a los distintos mtodos implicados (el mtodo plantilla, los mtodos
hook) en el patrn template method.
1) El mtodo plantilla debe ser final (pues nadie debe ser capaz de modificar el
algoritmo en este patrn) y pblico/privado/protegido dependiendo de las necesidades.
Los mtodos hook deben ser protegidos (no visibles desde fuera, pero visibles por sus
hijos) y abstractos (la funcionalidad deben concretarla los hijos que los hereden).
Perfecto
Cuestin 11: Una vez aplicado el patrn Faade, cmo podemos usar las clases del
subsistema que la fachada oculta?
1) La aplicacin del patrn Fachada no implica en ningn caso que se impida el acceso
a las clases del subsistema. Se puede seguir accediendo al subsistema de manera normal
(el ejemplo que se me ocurre es la relacin entre JFace y el SWT para creacin de
interfaces en java).
2) El patrn faade no impide de ninguna forma el uso de las clases del subsistema, este
patrn simplemente propone una interfaz para dicho subsistema con las ventajas
comentadas anteriormente. Por lo tanto podemos usar las clases y mtodos del
subsistema de manera normal, es decir de la misma forma que si la fachada no existiese.
Cuestin 12: Cmo podemos enganchar una nueva funcionalidad (clase o mtodo)
usando un mtodo plantilla? Quin es el encargado de llamar/usar esta nueva
funcionalidad?
1) Creando una nueva clase que extienda de la clase plantilla concreta, de modo que en
esta nueva clase se implementase los mtodos hook con la nueva funcionalidad que se le
quieren dar, el encargado de llamar a estas clases seria el mtodo plantilla siguiendo el
principio de hollywood
Correcto
Cuestin 13: Es posible tener una clase con un mtodo plantilla que no sea abstracta?
1) No, el mtodo plantilla slo define el esqueleto del algoritmo, las partes fijas s
aparecern especificadas, pero para completar la funcionalidad las partes variables del
algoritmo deben aadirla las clases hijas, por tanto la clase con mtodo plantilla har
uso de mtodos abstractos (sin implementar) en el mtodo plantilla. Automticamente
esto convierte a esa clase en abstracta.
2) Si, el caso visto anteriormente sobre que se de una implementacin por defecto de
todos los mtodos gancho.
Si damos implementacin por defecto de todos los mtodos gancho la clase no tiene que
ser abstracta.
1) No creo que sea correcto puesto que la fachada debera abstraer la funcionalidad ya
existente en el subsistema sirviendo como "interfaz simplificada" de ste, no aadir
nueva funcionalidad.
2) La forma de que una fachada aadiese nuevas funcionalidades es tan sencilla como
crear nuevos mtodos en la fachada para que implementasen dichas funcionalidades, sin
embargo esto no seria en absoluto correcto puesto que las fachadas son creadas para
facilitar el uso de un subsistema no para crear nuevas funcionalidades, es decir, todos
los cosas que pudisemos hacer con la fachada deberamos ser tambin capaces de
hacerlas utilizando directamente el subsistema.
Correctas las dos respuestas. Hay que tener en cuenta que combinar la funcionalidad
que ofrece el subsistema (varias llamadas a mtodos de distintas clases) para simplificar
no podra considerarse aadir una nueva funcionalidad.
2) por un lado la divisin del subsistema en varias capas, por otro eliminar (o reducir) el
acoplamiento entre las clases cliente y el subsistema
Cuestin 17: Cmo se puede implementar un paso opcional del mtodo plantilla sin
necesidad de usar una instruccin if?
1) En el esqueleto del mtodo plantilla usar un mtodo abstracto que ser el paso
Opcional, que deber ser concretado en la clases hijas, pero, en stas se implementar o
no, dependiendo de si se quiera o no usar ese paso opcional.
Correcta la segunda respuesta. De hecho esto es bastante comn, pues evita que el
usuario del framework tenga que incluir mtodos que no necesita con una
implementacin vaca. Lo que se hace es aadirlos en la clase padre con una
implementacin por defecto vaca.
Cuestin 18: Una clase que contenga un mtodo plantilla con muchos mtodos abstract
obliga a las subclases a realizar gran parte de la implementacin del algoritmo. Es esto
deseable? En qu situaciones puede ocurrir esto? Cmo podemos evitarlo?
1) Depender de la situacin y del control que se le quiera dar a cada usuario. Por
ejemplo existe el patrn Estrategia precisamente para que el cliente cambie todo el
algoritmo en lugar de tan slo una parte.
No es deseable, pues esto implica un mal diseo. Muy bien la idea de usar estrategia en
estas situaciones.
2) Evidentemente esto no es nada deseable, puesto puede llegar el caso que fuera
preferible que la clase no usara la plantilla y realizara una implementacin del algoritmo
de una forma directa, esto sucede en caso de que la plantilla no tuviera muchas partes
fijas, por lo que la mayor parte son llamadas a mtodos abstractos. Por ultimo una
posible solucin seria dar una implementacin por defecto a dichos mtodos de manera
que no fuera necesario definirlos todos, lo cual ahorrara trabajo al cliente
Cuestin 1: Cul es el principal objetivo del patrn Factory Method? Y del idiom
Simple Factory? Deje clara la diferencia entre los dos patrones.
En los dos casos consiste en desacoplar la creacin de objetos de las clases que tiene
que utilizarlos. En ambos casos esto es debido a que el conjunto de productos a crear no
es fijo y representa por tanto un punto de variacin.
El objetivo de factory method es: Definir una interfaz para crear objetos de tipo
genrico permitiendo a las subclases decidir qu tipo de objetos concreto crear
.
Es el mismo que en simple factory slo que se ampla para proporcionar un diseo en el
que los productos se pueden aadir sin necesidad de retocar el cdigo existente, es decir,
desacopla la creacin de objetos facilitando la creacin de frameworks. Aplicando
variaciones protegidas, y dentro de este principio, el principio de hollywood.
Son iguales, slo que en Factory Method el mtodo gancho se encarga de crear objetos
y es llamado create.
Los mtodos gancho en el caso de factory method es el create y hay que puntualizar que
no tiene que ser abstracto forzosamente, podemos proporcionar una implementacin por
defecto.
Deberamos aadir tambin, que al definir una interfaz comn para todos los productos
a crear, tambin aseguramos que estos cumplan con ella y puedan aadirse al
framework sin retocar el cdigo del mismo.
Cuestiones especficas
Correcto. As, si cambiamos los productos solo habr que cambiar el cdigo de la
fbrica y no el de todas las clases que los usen.
Cuestin 8: Cul es la ventaja del Factory Method cuando se tiene un nico producto
concreto?
1) Que al existir una fbrica entre el cliente y el producto concreto, el cliente no tiene
acoplamiento con el producto concreto, no tiene que conocer su implementacin y lo
protege de posibles variaciones
Correcto, pero habra que aadir que proporciona las ventajas derivadas de un
framework: nos permite aadir nuevos productos y nuevas fbricas concretas de manera
transparente (sin tener que modificar el cdigo del framework)
No es correcto. En los dos se elige el objeto a crear en tiempo de ejecucin (dentro del
cdigo del create). La diferencia primordial es que en factory method el creador
concreto hereda de la clase padre el cdigo donde se va a utilizar ese create, mientras
que en simple factory esto no est definido y puede ser cualquier objeto el que haga uso
de la simple factory para pedirle objetos.
Adems, podemos aadir varias simple factories para todos los subconjuntos de objetos
que queramos crear, igual que en factory method.
Cuestin 10: Deben ser los mtodos factora siempre abstractos? Y protegidos?
1) No tiene porque, ya que el mtodo tambin podra dar una implementacin por
defecto y luego completarla en las subclases concretas.
Correcto
2) No siempre tienen que ser abstractos, se les puede dar una implementacin por
defecto y que las subclases los redefinan. Protegidos si deben de serlo para que solo
sean accesibles por las subclases que los pueden redefinir, es decir las fabricas
concretas.
Correcto a medias. Deben ser protegidos para que slo se usen desde el mtodo de la
clase padre que hace la llamada al create.
Cuestin 11: Es obligatorio que el Factory Method o el create del Simple Factory
tomen un parmetro para decidir que tipo de objeto crear?
No pues otra opcin es que decidan por ellos mismos que objetos devolver.
Boletn 3.3.3: Strategy y Adapter
Cuestiones generales
Strategy: Estructurar una familia de algoritmos de modo que sus clientes puedan
intercambiarlos en tiempo de ejecucin
Adapter: Convertir la interfaz de una clase en otra interfaz esperada por los clientes.
Permite que clases con interfaces incompatibles puedan comunicarse
Que la clase cliente o la que tenemos que adaptar no puedan ser modificadas, o que sea
mas costosa la modificacin de stas que crear un adaptador.
Que una clase con interfaz incompatible pueda ser usada sin necesidad de modificar el
cdigo existente. Como ventaja opcional conseguimos desacoplar el cliente y la clase
adaptada.
Se mejora la cohesin del las clases que usan los algoritmos en aquellos casos en los
que el diseo alternativo sea incluir los algoritmos como mtodos de las clases cliente.
1) Los dos patrones son de tipo comportamiento, ambos permiten cambiar el cdigo.
Mientras que el mtodo plantilla nos permite cambiar parte del cdigo por herencia,
tiempo de compilacin. Tambin nos permite factorizar el comportamiento comn de un
algoritmo y as evita que tengamos que duplicar cdigo, dejando que las extensiones se
encarguen las subclases.
Correcto
El estrategia nos permite cambiar todo el cdigo por composicin, en tiempo de
ejecucin sin embargo tenemos que duplicar cdigo, es posible que obliguemos a una
subclase implementar algo que no debe y adems no puedo reutilizar.
El patrn Adapter su funcin es que un cliente que usa un objeto de una interfaz pueda
usar un objeto con una interfaz diferente sin tener que cambiar el cdigo de ninguno de
los dos.
Correcto. Matizar que fachada no desacopla completamente, pues fachada se usa para
un caso de uso determinado y no para todos los usos.
Cuestiones especficas
Basta con aadir un mtodo setStrategy a la clase que usa las estrategias o aadir en esta
clase el cdigo necesario para decidir que estrategia usar en cada momento
Boletn 3.3.4: Decorator
Cuestiones generales
1) El cumplir el principio abierto/cerrado, es decir que una clase se pueda extender sin
que se vea afectada por las modificaciones. Poder modificar algo sin tener que aadir,
cambiar cdigo.
Aclarar que quin no debe verse afectado por las modificaciones es el cliente de esas
clases.
Correcto.
1) Supongo que ser lo contrario a cuando usar el patrn, cuando me da igual fijar las
cosas en tiempo de compilacin.
Yo dira lo mismo de otro modo: Ambos pueden cambiar el comportamiento del objeto
en tiempo de ejecucin.
An as hay que tener claro que decorador aade/extiende el objeto, mientras que
strategy mantiene el objeto con las mismas responsabilidades solo que modifica la
forma en la que se llevan a cabo.
Cuestiones especficas
Cuestin 6: Es posible decorar un objeto varias veces e incluso decorar otro decorador
Que clases/relaciones permiten esto?
Correcto. Es posible y esto es posible gracias a que tanto los decoradores como los
objetos a decorar heredan/implementan la misma interfaz (interfaz, clase abstracta,
clase).
Correcto. Es importante que notis que al hablar de interfaz en diseo nos referimos al
conjunto de responsabilidades que ofrece un objeto y no al concepto de interface JAVA.
1) Para cambiar el objeto al que se decora en tiempo de ejecucin, habra que sustituir
dicho objeto con una llamada al constructor del decorador concreto. Es decir c = new
decoradorconcreto( c ); Para cambiar el decorador supongo que hara falta un decorador
para el decorador.
Ms o menos bien. Otra opcin para cambiar el objeto que se decora es aadir un
mtodo setDecorado en los decoradores. Para cambiar los decoradores basta con crear el
nuevo decorador y fijarle el objeto a decorar: bien con el constructor o con el mtodo
setDecorado.