Sie sind auf Seite 1von 7

Arquitecturas Reflexivas y Generacin de Cdigo

Arquitecturas Reflexivas y Generacin de Cdigo.


1.- Empezemos con un ejemplo: AnotherAmazon.com . 2.- Generacin de cdigo fuente (o desarrollo manual en su defecto).. 3.- Qu es una arquitectura reflexiva. 4.- Cundo desarrollar una arquitectura reflexiva.

1.- Empezemos con un ejemplo: AnotherAmazom.com. Imaginemos que recibimos el encargo de construir un portal comercial orientado a la venta por internet de artculos de consumo como libros, pelculas, DVDs, CDs, impresoras, ratones, cmaras fotogrficas, reproductores mp3, televisores, y toda clase de consumibles electrnicos. Cada uno de estos tipos de objetos se definen por sus caractersticas. De hecho tendremos: Caractersticas que aparecern en todos los objetos, como por ejemplo el precio que el comprador debe pagar para poder obtenerlo, as como un peso y volumen, elementos a tener en cuenta en cuanto al transporte, etc. Un conjunto de atributos particulares para cada tipo de objeto. Por ejemplo en las cmaras digitales fotogrficas la resolucin mxima de definicin (medida en megapxeles), o por ejemplo en los CDs y DVDs la duracin de las pelculas o discos de msica que contengan. Para la gestin de toda esta informacin, surge de forma evidente la necesidad de guardar todos los datos en bases de datos, de tal forma que podamos gestionar la informacin de forma adecuada, con todas las garantas que nos da este tipo de software. Para la finalidad de lo que as se explica consideraremos que tendremos una tabla por cada tipo de objeto, cuyos campos sern las caractersticas (tanto comunes como particulares) de ese tipo de objeto. De esta forma la informacin asociada a cada objeto se guardar en la tabla del tipo al que pertenezca, por ejemplo los libros se guardarn en la tabla Libros. Evidentemente todo esto es una simplificacin pero nos sirve para nuestro pequeo. Nuestra tarea consiste bsicamente en gestionar la publicacin web de toda esta informacin (olvidemos el carrito de la compra). Publicar esta informacin consiste bsicamente en permitir al usuario, a travs de un navegador web, el poder: Visualizar listados de productos de un determinado tipo. Filtrar estos listados. Visualizar los detalles de un producto especfico. Tenemos bsicamente dos posibilidades tcnicas para llevar a buen puerto esta tarea: Construir o generar componentes web para cada una de estas categoras. De esta forma tendramos un componente (conjunto de pginas JSPs o ASPs) distinto para cada tipo de objetos. De esta forma encapsularamos en cada componente el conocimiento sobre las caractersticas de cada tipologa. Tendramos por ejemplo un Jsp/Asp para listar DVDs (ListDvd.jsp), y otro para visualizar la Moiss D. Daz. www.moisesdaniel.com Pg. 1

Arquitecturas Reflexivas y Generacin de Cdigo informacin asociada a un DVD (ShowDvd.jsp?id=83838). Esto implica tener mucho cdigo que deberemos construir (costoso) o generar, y mantener (muy costoso).

Books

User Books

DVDs User DVDs

...

...

WebServer

User

Mobiles Mobiles

User

Tener un nico componente web genrico de tal forma que leyendo las propiedades de cada tipo de objeto (datos que guardamos en la tabla MetaInformacin), sea capaz de mostrar cualquier objeto sea cual sea su tipo. Podramos verlo como tener un nico Jsp/Asp para listados (List.jsp?type=DVD), y otro para visualizar registros (ShowElement.jsp?type=DVD&id=83838). A la informacin que describe la estructura de cada tipo de objeto se le llama metainformacin. El coste de creacin puede ser alto o no serlo, pero el de mantenimiento es muy bajo.

MetaInformation

User

Books Generic Web Component DVDs WebServer ... Mobiles User User User

Moiss D. Daz. www.moisesdaniel.com

Pg. 2

Arquitecturas Reflexivas y Generacin de Cdigo 2.- Generacin de Cdigo Fuente (o desarrollo manual en su defecto). Cada tipo de objeto tiene un conjunto de caractersticas comunes con otras tipos as como otras caractersticas diferentes al resto. Esto implica que en la base de datos tendremos tablas asociadas a cada tipo de objeto, y que por lo tanto los componentes web que listan y visualizan cada tipo (en definitiva pginas JSPs, ASPs, Servlets, etc) deben tener una estructura muy similar ya que su funcin es prcticamente la misma, pero a su vez esta estructura o cdigo debe ser algo diferente debido a las caractersticas particulares de cada tabla (tipo de objeto) a la que sirve de interfaz web. De hecho el cdigo de cada componente asociado a un tipo es totalmente dependiente de la estructura de la tabla a la que sive de interfaz, con lo que una vez definida cada tabla podramos optar por generar de forma automatizada todo o parte del cdigo que la lista, visualiza, etc, la otra posibilidad es utilizar la conocida tcnica de copiar-pegarmodificar cuyos resultados suelen ser similares a la de la generacin de cdigo pero que es mucho ms costosa y propensa a errores. Existen multitud de herramientas que realizan funciones de generacin de cdigo, como por ejemplo CodeCharge, Xcripter, y montones de wizards de diferentes entornos de desarrollo. Ya que con la generacin automtica de cdigo fuente obtenemos los mismos resultados, pero a un coste bajsimo, podramos pensar que son la solucin al problema que hemos planteado al inicio del artculo (la construccin de AnotherAmazon.com). Sin embargo la generacin de cdigo tiene numerosas pegas (no digamos ya la tcnica de copiar-pegar-modificar) y por lo tanto no es la tcnica apropiada para todos los proyectos. Centrmonos por tanto en la generacin de cdigo fuente. La generacin de cdigo tiene un escenario tpico que es el de las interfaces entre diferentes capas, componentes, etc, lugares en los que una pequea cantidad de informacin puede ser usada para generar todo el cdigo repetitivo que se requiere (ej: Wsdl Soap, mapeo OO RDBMS, tablas formularios) (en nuestro caso de tablas a listados Html y visualizacin Html de sus registros). Existen bsicamente 3 tipos de generacin de cdigo [ACG]: Templating. Se genera un armazn (o esbozo) de cdigo fuente no funcional para ser editado, con el que se evita tener que escribir la parte ms repetitiva del cdigo (generalmente poco compleja). Suele ser una opcin recomendable. Ejemplo: Si usamos Oracle JDeveloper para construir un nuevo Servlet, ste nos genera automtica una clase Servlet con los imports bsicos y los mtodos que tiene esta clase. Parcial. Se genera cdigo fuente que implementa parcialmente la funcionalidad requerida, pero que el programador usar como base para modificar, integrar y/o adaptar a sus necesidades. No suele ser recomendable. Por ejemplo: generamos una aplicacin para el mantenimiento de tablas de bbdd (como aplicaciones web realizadas con CodeCharge, o componentes BC4J del JDeveloper), en el momento en que queramos modificarla, integrarla con otros desarrollos o adaptarla a necesidades ligeramente diferentes, tenemos que bucear en enormes cantidades de cdigo que no entendemos y que debemos modificar extensivamente. Total. Se genera cdigo fuente funcionalmente completo pero que no va a ser modificado por el programador, sino que si es necesario se vuelve a regenerar. Por lo general tampoco suele ser un cdigo excesivamente complejo.

Moiss D. Daz. www.moisesdaniel.com

Pg. 3

Arquitecturas Reflexivas y Generacin de Cdigo Recomendable. Ejemplo: generacin de un Stub para un WebService en JDeveloper. Centrmonos en la generacin parcial (es decir generacin automtica + modificaciones y desarrollos en el mismo). Suele ser problemtica, ya que: El cdigo generado es lo suficientemente complicado como para ser difcil de modificar con respecto a la funcionalidad implementada. Su regeneracin suele ser costosa ya que hay si regeneramos el cdigo hay que volver a modificarlo para volver a adaptarla al problema. Todo este cdigo acaba siendo cdigo a mantener, y no podemos olvidar que el mantenimiento es el mayor coste de cualquier proyecto. Hace que el cdigo sea dependiente de una herramienta adicional de desarrollo. Esto es muy restrictivo, ya que complica el mantenimiento (en muchsimas ocasiones no lo hace la misma empresa que lo desarroll, o surgen nuevos entornos que hacen inviable el uso de esas herramientas de generacin (por ejemplo CodeCharge al principio generaba JSPs, ahora Servlets!!)), es una dependencia ms y adems fuerte. La generacin de cdigo funcional (parcial o semitotal) suele darte casi la funcionalidad que necesitas, pero no exactamente la necesitada. Modificarla es difcil. Una de las grandes metas de la ingeniera del software es crear software reutilizable, lo cual suele traducirse en cdigo robusto, poco propenso a errores. Entonces, por qu no parametrizar todo ese cdigo repetitivo pero diferente unificndolo en uno solo (es decir refactorizarlo)? Todo depende de las dimensiones de la aplicacin, ya que esa refactorizacin se consigue generalmente mediante arquitecturas reflexivas. No olvidemos que desarrollar una arquitectura tiene su coste. Slo hay dos aspectos positivos de la generacin parcial de cdigo: - Por lo general tiene un mejor rendimiento respecto a las a.r. - Es ms rpido de desarrollar que construir una a.r. (a no ser que ya la tengas implementada). La generacin de componentes webs (JSPs, ASPs, etc) asociados a tipos de objetos entrara en la categora de generacin parcial de cdigo. Es evidente que podemos generar cdigo que liste y visualize registros de tablas, pero este cdigo generalmente forma parte de una aplicacin que debe de integrarse con desarrollos especficos como cdigo de seguridad, uso de tecnologas especficas de acceso a base de datos (por ejemplo un pool de conexiones), elementos de navegacin, normas de estilo y visualizacin, uso de logs, mecanismos de personalizacin, servicios de impresin, etc, etc. Cuando nos enfrentamos a la construccin de aplicaciones medianas/grandes la generacin de cdigo suele ser muy problemtica. 3.- Qu es una arquitectura reflexiva. Tal y como aparece en [POSA] las arquitecturas reflexivas se han usado en multitud de sistemas y son especialmente apropiadas cuando necesitamos aplicaciones muy flexibles y adaptativas. Una arquitectura reflexiva se caracteriza por tener una serie de elementos que contienen informacin estructural de parte del sistema, es decir que lo describe. El sistema usa esta metainformacin como elemento bsico que le permite interaccionar con esos elementos descritos (generalmente llamados base). Una caracterstica fundamental es que por lo general todos los elementos base que son descritos comparten una serie de caractersticas de tal forma que pueden ser sometidos a ciertas transformaciones (operaciones) de forma uniforme, y que sin embargo tambin

Moiss D. Daz. www.moisesdaniel.com

Pg. 4

Arquitecturas Reflexivas y Generacin de Cdigo contienen elementos diferenciadores que hace que estas operaciones sean bastantes dependientes de cada elemento base. Estas caractersticas diferenciadas hacen que por lo general se desarrolle cdio especfico por cada uno de estos elementos base, sin embargo existen ocasiones en las que nos es mucho ms rentable desarrollar una arquitectura reflexiva que trate a todos estos elementos de forma uniforme.
interface IBaseElement +Operation1() +Operation2() +OperationN() Client

BaseElement1 -attr1 -attr2 -attrN +Operation1() +Operation2() +OperationN()

BaseElementN -attr1 -attr2 -attrN +Operation1() +Operation2() +OperationN()

...

Base Elements implement each Operation. Programmer must to develop a lot of specific code for each Operation for each Base Element.

Toda esta arquitectura puede verse tambin como una tpica estrategia de centralizacin o aplicacin del metapatrn encapsulador-centralizador.
OperatorsEncapsulator +GenericOperation1() +GenericOperation2() +GenericOperationN()

Descriptor -desc1 -desc2 -descN

interface IBaseElement +...()

Client

BaseElement1 -attr1 -attr2 -attrN +...()

BaseElementN

...

-attr1 -attr2 -attrN +...()

Now Operations are encapsulated and centralized in one Class, that use the metainformation contained in Descriptor for custimizing each operation for each base element. Programmer must to develop for all class only Generic Operations.

Beneficios: Cambiar un sistema software (aadir elementos, campos, etc) es fcil. Soporta numerosos tipos de cambios.

Moiss D. Daz. www.moisesdaniel.com

Pg. 5

Arquitecturas Reflexivas y Generacin de Cdigo Perjuicios: Menor eficiencia. Se incrementa el nmero de componentes. Las arquitecturas reflexivas no siempre son la mejor opcin, sobre todo si no hay muchos elementos base de los que generar cdigo. Respecto al rendimiento, ciertamente son arquitecturas que aaden una capa adicional de indireccin y que por lo tanto dependiendo de la aplicacin especfica pueden ser lentas (aunque no tienen por qu serlo por norma general). Existen adems medios para aumentar espectacularmente el rendimiento de esta arquitectura, como por ejemplo el uso de cachs. 4.- Cundo desarrollar una arquitectura reflexiva. Desarrollar una arquitectura tiene costes y no es apropiada en todas las circunstancias, sino que dependen de numerosos factores. Por lo general implementar una arquitectura reflexiva requiere desarrollar elementos de cdigo bastante complejo, necesita de ciertas clases adicionales, de ese nivel adicional de indireccin que es precisamente el que nos proporciona la potencia y flexibilidad necesario. Por esto si la aplicacin es pequea no es aconsejable implementar una arquitectura reflexiva, ya que sta elevara la complejidad de la aplicacin, su coste y los conocimientos necesarios para su mantenimiento sin aportar mucho a cambio. Por tanto, cundo implementarla?: Precisamente cuando necesitamos un sistema altamente flexible en ciertos aspectos (ya sea por su dinmica en explotacin o en su desarrollo, desconocimiento de requisitos o que sean muy difusos). Cuando tengamos una gran cantidad de elementos base (como por ejemplo tablas) en los que la otra opcin sera la generacin de enormes cantidades de bloques de cdigo similar pero ltamente dependiente del objeto al que sirven de interfaz funcional (por ejemplo tablas de bases de datos). Cuando nuestra actividad tcnica consista en realizar aplicaciones en las que por lo general se utilizen tcnicas de copiar-pegar-modificar o generacin parcial de cdigo. En este caso el desarrollo de una arquitectura reflexiva que reutilicemos en todos nuestros desarrollos queda plenamente justificada y amortizada. Imaginemos un portal como el que hemos descrito al inicio de este artculo (AnotherAmazon.com) que gestione numerosas tablas distintas de objetos para su venta, es decir aqu existiran una gran cantidad de elementos base. Este es el escenario ideal para implementar una arquitectura reflexiva que adems nos permita modificar de una forma centralizada y sencilla tanto la informacin que contienen estos elementos, aadir nuevos elementos de informacin como por ejemplo Reproductores DVDs, etc.

Moiss D. Daz. www.moisesdaniel.com

Pg. 6

Arquitecturas Reflexivas y Generacin de Cdigo Referencias:


[ACG] Automated Code Generation: http://c2.com/cgi/wiki?AutomatedCodeGeneration [CGIDS] Code Generation is a Design Smell: http://c2.com/cgi/wiki?CodeGenerationIsaDesignSmell [OAOO] Only and Only Once: http://c2.com/cgi/wiki?OnceAndOnlyOnce [RCG] Reflection versus Code Generation: http://www.javaworld.com/javaworld/jw-11-2001/jw-1102codegen.html [POSA] Pattern-Oriented Software Architecture: A System of Patterns (POSA) Buschmann, Meunier, Rohnert, Sommerlad, Stal; Wiley and Sons, 1996. [WIR] What is Refactoring http://c2.com/cgi/wiki?WhatIsRefactoring

Moiss D. Daz. www.moisesdaniel.com

Pg. 7

Das könnte Ihnen auch gefallen