Sunteți pe pagina 1din 8

http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?

pagina=grasp

Roberto Canales Mora


Creador y propietario de AdictosAlTrabajo.com, Director General de Autentia S.L., Ingeniero Tcnico de
Telecomunicaciones y Executive MBA por el Instituto de Empresa 2007.
Twitter:
Autor de los Libros: Planifica tu xito: de aprendiz a empresario y Informtica profesional, las reglas no escritas
para triunfar en la empresa
Puedes consultar mi CV y alguna de mis primeras aplicaciones (de los 90) aqu
Ver todos los tutoriales del autor

Fecha de publicacin del tutorial: 2003-12-22


Tutorial visitado 58.598 veces Descargar en PDF

Patrones de GRASP
Un proceso de desarrollo sirve para normalizar quien hace que cosa en cada momento y como debe realizarse
esta cosa.
En el mundo de las nuevas tecnologas todo avanza muy deprisa por lo que es probable que todava no hallamos
alcanzado un grado de madurez lo suficientemente elevado como para poder normalizar actividades,
fundamentalmente porque stas cambian de semana en semana.
Normalizando un proceso de desarrollo de software, lo que queremos ganar (porque cuando hacemos algo
normalmente es por ganar algo) pueden ser distintas cosas:

Capacidad de predecir el coste futuro de la ejecucin del siguiente proyecto

Evitar riesgos con tareas no planificadas.

Eliminar dependencias a personas por producir piezas de un modo estandarizado y documentado.

Aumentar la confianza en los sistemas desarrollados y reducir sus errores.

Favorecer la reutilizacin de piezas (con la consiguiente reduccin de costes)

y muchas cosas ms ....

Uno de los procesos ms reconocidos, es el denominado Proceso Unificado de Jacobson, Booch y Rumbaugh.
Este proceso se dice que es "dirigido por casos de uso, centrado en la arquitectura, iterativo e incremental". Si
recurrimos al libro (ISBN 0-201-57169-2, El proceso unificado de desarrollo de software), me parece francamente bueno
pero ..... siempre hay un pero ..... para realizar correctamente la ejecucin de un proyecto, es necesario

complementarlo con otras fuentes. Si esta centrado en la arquitectura, esta debe ser lo ms robusta posible por lo
que debemos profundizar en este punto.
Existe otro libro, llamado UML y Patrones (Craig Larman, ISBN-84-205-3438-2) que nos puede ayudar en la primera
fase del diseo, la identificacin de las clases en base a su responsabilidad). Es una obra muy buena pero puede
ser un poco densa para usuarios principiantes ..... aunque la primera mitad no tiene desperdicio.
Para comprender bien el libro anterior y que nuestros diseos sean completos, nos hacen falta unos cuantos
libros ms sobre patrones de diseo (Coad, GoF, etc.) que, por suerte, podemos hasta encontrar, de algunos de
ellos, su versin electrnica en Internet (Thinking in Patterns, Design Patterns, Core J2EE patterns) y, aunque
profundizaremos en otros tutoriales en el uso de estos patrones, comprobareis que no pueden vivir unos sin los
otros .... e incluso, en algunos casos se pueden decir que son los mismos ...... descritos en otro mbito.
Un patrn es una descripcin de un problema bien conocido que suele incluir:

Descripcin

Escenario de Uso

Solucin concreta

La consecuencias de utilizar este patrn

Ejemplos de implementacin

Lista de patrones relacionados

Patrones hay muchos (muchas familias) ... de momento vamos a ver como nos pueden ayudar los primeros
(GRASP).
GRASP es el acrnimo de General Responsibility Assignment Software Patterns. Una de las cosas ms
complicadas en Orientacin a Objeto consiste en elegir las clases adecuadas y decidir como estas clases deben
interactuar. Incluso cuando utilizamos metodologas rpidas como programacin extrema (extreme
programming) y centramos el proceso en el desarrollo continuo, es inevitable elegir cuidadosamente las
responsabilidades de cada clase en la primera codificacin y, fundamentalmente, en la refactorizacin
(continual) de nuestro programa.
En su obra, Larman intenta definir un enfoque sistemtico a la creacin de clases y mtodos.
Para obtener ms informacin sobre el primer autor que ha documentado los patrones de GRASP (y entrar en
depresin por la cantidad de cosas que nos queda a todos por aprender) poder visitar su Web (Craig Larman).
Lo patrones de GRASP, no compiten con los patrones de diseo..... los patrones de GRASP, nos guan para
ayudarnos a encontrar los patrones de diseo (que son ms concretos).....
Vamos a ver el catlogo de patrones y algunas recomendaciones (como muchas son de mi cosecha, podis
escribirme para aportar crticas constructivas):
Patrn

Descripcin

Debe haber pocas dependencias entre las clases. Si todas las clases dependen
de todas cuanto software podemos extraer de un modo independiente y
reutilizarlo en otro proyecto?.
Para determinar el nivel de acoplamiento de clases, son muy buenos los
diagramas de colaboracin de UML.
-------------Bajo
Acoplamiento

Uno de los principales sntomas de un mal diseo y alto acoplamiento es una


herencia muy profunda. Siempre hay que considerar las ventajas de la
delegacin respecto de la herencia.
Como ejemplo (de mal diseo), en muchos diseos Web se puede ver como
se crea un servlet base con capacidades de paginacin y se hereda de l para
construir los dems. La paginacin es un servicio que se podra usar en
aplicaciones no Web, por lo que es ms adecuado mantener estas capacidades
en clases externas.
Otro ejemplo clsico se produce cuando se pasan los objetos relacionados con
la capa de presentacin a la capa de negocio (HttpRequest, HttpResponse).
Cada elemento de nuestro diseo debe realizar una labor nica dentro del
sistema, no desempeada por el resto de los elementos y auto-identificable.
--------------Ejemplos de una baja cohesin son clases que hacen demasiadas cosas.
En todas las metodologas se considera la refactorizacin. Uno de los
elemento a refactorizar son las clases saturadas de mtodos.

Alta Cohesin

Ejemplos de buen diseo se producen cuando se crean los denominados


"paquetes de servicio" o clases agrupadas por funcionalidades que son
fcilmente reutilizables (bin por uso directo o por herencia).
---------------En java, pensar en interfaces nos fuerza a que nuestros sistemas sigan los
principios de alta cohesin. En algn sitio le que una aplicacin con menos
de 8 interfaces no utiliza correctamente los conceptos de orientacin a
objeto ... y estoy de acuerdo ....

Experto

La responsabilidad de realizar una labor es de la clase que tiene o puede tener


los datos involucrados (atributos) . Una clase, contiene toda la informacin
necesaria para realizar la labor que tiene encomendada.

-----------Hay que tener en cuenta que esto es aplicable mientras estemos considerando
los mismos aspectos del sistema:

Lgica de negocio

Persistencia a la base de datos

Interfaz de usuario

No tiene sentido considerar que una clase se debe escribir a si misma en base
de datos o formatearse para presentarse en una pgina HTML por el hecho de
poseer los datos. Estos son elementos estructuralmente distintos y deben
considerarse desde una perspectiva distinta.

Creador

Se asigna la responsabilidad de que una clase B cree un Objeto de la clase A


solamente cuando
1. B contiene a A
2. B es una agregacin (o composicin) de A
3. B almacena a A
4. B tiene los datos de inicializacin de A (datos que requiere su
constructor)
5. B usa a A.
-------------El hecho de crear objetos tiene casusticas particulares:

Pool de Objetos

Caches

Instancias nicas

Estos casos son candidatos para la utilizacin de otros patrones ms concretos


(de diseo).
-----------A la hora de crear objetos en distintos lenguajes hay que tener en cuenta sus

peculiaridades. En Java por ejemplo:

No confundir referencias y el valor referenciado a la hora de retornar


objetos desde mtodos.

Conocer la peculiaridad de las String (cadenas constantes)

Identificar problemticas del recolector de basura y el uso de recursos


del sistema

Conocer el mbito y naturaleza de distintos tipos de componentes


o En servlets y JSPs pueden descargarse y estar activos en ms
de una mquina virtual.
o Los servlets y JSPs son multi-thread a priory.
o Los tags son reciclados en JSP (ojo con valores anteriores de
atributos de clase).
o Los EJB se desactivan.
o etc..

Controlador

Y muchas cosas ms... que la experiencia nos ensea ....

Asignar la responsabilidad de controlar el flujo de eventos del sistema, a


clases especficas. Esto facilita la centralizacin de actividades (validaciones,
seguridad, etc.) . El controlador no realiza estas actividades, las delega en
otras clases con las que mantiene un modelo de alta cohesin.
Un error muy comn es asignarle demasiada responsabilidad y alto nivel de
acoplamiento con el resto de los componentes del sistema.
--------------------En UP (proceso unificado), al construir el modelo de anlisis, existen
estereotipos predefinidos que favorecen la separacin de entidades,
mecanismos de interfaz y mecanismos de control.
--------------------En aplicaciones Web, se tiende a separacin de la lgica de presentacin y de
la lgica de negocio. Patrones bin conocidos como MVC o Fachada, son de
amplia utilizacin..
Hay otros muchos patrones relacionados sobre todo en entornos multi-capa

(Core J2EE patterns).


-------------------En el diseo de clases de negocio, cuando no tenemos claro a qu clase
pertenece la responsabilidad de realizar una determinada tarea, crear una
clase controlador que se llame igual a la tarea a desempear.
Cuando identificamos variaciones en un comportamiento, asignar la clase
(interfaz) al comportamiento y utilizar polimorfismo para implementar los
comportamientos alternativos.
-------------------Polimorfismo

El implementar comportamiento alternativos con sentencias IF-ELSE, no


hace ms que limitar la reutilizacin y crecimiento de la aplicacin. Imagine
que una aplicacin muestra mensajes distintos en distintos idiomas.... con IF,
al aumentar en uno el nmero de idiomas, nos obligara a aadir un nuevo IF.
Con polimorfismo nos limitaramos a crear un objeto de una clase
polimrfica nueva (bajo acoplamiento, alta cohesin y potencial
reutilizacin).
Cuando los problemas se complican, construir clases que se encarguen de
construir los objetos adecuados en cada momento (factoras) .
--------------Todo proyecto tiene numerosa factoras potenciales, para intercambiar
fcilmente comportamientos:

Fabricacin Pura

Look&Feel (decoradores y familias de componentes grficos)

Sistemas de log

Clases de acceso a gestor a bases de datos

Sistemas multi-lenguaje

Privilegios en base al rol de usuario

Muchas ms capacidades comunes

Crear clases intermedias para desacoplar clientes de servicio y servicios.


Indireccin
-----------------

Pensar en sistemas middleware y se ver la utilidad de un modo inmediato.

Un mtodo, solamente invocar a mtodos de:

No hables con
extraos

De si mismo (this)

De su rea de parmetros

Un objeto creado en su propio mbito

(los dems los doy por incluidos)

-------------------Un fallo comn en la construccin de sistemas Web en la utilizacin de


variables globales (estticas) o el acceso desde muchos puntos
desordenadamente a variables de sesin o aplicacin (contexto).

Aunque pueden parecer muy evidentes los principios anteriormente enumerados, estaris de acuerdo conmigo
que es muy complicado llevarlo a cabo en proyectos reales. Hay varios factores que lo hace difcil:

La presin del da a da por producir resultados (aunque sean de poca calidad).

La planificacin de proyectos a coste fijo (y a precios bajos) que quita las ganas de pararse a pensar
(ms con 50 horas semanales de trabajo)

La poca inversin en formacin de muchas empresas (modelo de servicios puro, propiciado los ltimos
aos)

Falta de personas de referencia (que nos enseen y aprendamos juntos) en los equipos de desarrollo.

Aunque personalmente y siendo positivo, yo que me dedico ahora a la formacin, estoy viendo claramente un
inters creciente por los responsables de equipos en mejorar el conocimiento y la calidad del producto....
posiblemente motivado por demandas del cliente ( :-( ).

Por cierto (y aunque no tenga demasiado que ver )... visitando el Web de Peter Coad, he visto una cosa (simple
y de gran utilidad) que nos puede ayudar a identificar visualmente la necesidad de aplicar algunos de los
patrones anteriores ..... la justificacin (a travs de uno de sus libros) de por qu es conveniente la utilizacin de
colores para la creacin de modelos UML (a mi me ha convencido a la primera).
http://pcoad.com/download/bookpdfs/jmcuch01.pdf

A medida que se profundiza en el conocimiento .... crece la sensacin de no tenerlo ......... pero no os preocupis
........ creo que le pasa a toda la humanidad.
Sobre el Autor ..

S-ar putea să vă placă și