LA CALIDAD SIN NOMBRE Los analistas/diseñadores con gran experiencia aplican, de forma mayormente intuitiva y automática, criterios precisos que, de forma global, solucionan de forma elegante y efectiva los problemas de modelación software de sistemas reales. Usualmente estos diseñadores utilizan métodos, estructuras y subsistemas que son, a la vez, herramientas del diseño y partes de la solución final, de una manera que díficilmente puede transmitirse, en un sentido formal, a especialistas menos expertos. Estos bien-dotados diseñadores poseen, también, un sentido especial que “detecta” la completitud, en un sentido eminentemente arquitectónico, de un determinado diseño, con independencia de las posibles métricas y paradigmas utilizados. Naturalmente lo ideal sería extraer la quintaesencia de estos afortunados diseños para formular una suerte de “bálsamo de fierabrás” que pudieran ingerir los diseñadores noveles. Aunque, ¿existe en verdad una parte común en los buenos diseños, a veces tan dispares entre sí? Alexander así lo afirma, y da a esta parte la elusiva calificación de “la calidad que no se puede nombrar”. Alexander sostiene que existe un “algo innombrable” que no puede ser modelado únicamente por medio de un conjunto arbitrario de requerimientos. Esto es, que los sistemas poseen una esencia cualitativa que les otorga verdadera identidad y equilibra sus fuerzas internas. Y si bien tal calidad no tiene nombre, sí pueden adjetivarse los sistemas que la poseen: vivos, completos, libres, exactos, despersonalizados y eternos. Bien, esto puede sonar un tanto místico, pero así suena Alexander todo el tiempo. Pongamos un ejemplo arquitectónico práctico: si nos fijamos en las construcciones de una determinada zona rural observaremos que todas ellas poseen apariencias parejas (tejados de pizarra con gran pendiente, etc.), pese a que los requerimientos personales por fuerza han debido ser distintos. De alguna manera la esencia del diseño se ha copiado de una construcción a otra, y a esta esencia se plegan de forma natural los diversos requerimientos. Diríase aquí que existe un “patrón” que soluciona de forma simple y efectiva los problemas de construcción en tal zona. Este patrón, no obstante, para ser considerado como tal, y siempre según Alexander, debe encerrar la capacidad de conectar con la cualidad buscada. PATRONES DE DISEÑO SOFTWARE Tal y como Alexander expone, “cada patrón describe un problema que ocurre una y otra vez en nuestro entorno, para describir después el núcleo de la solución a ese problema, de tal manera que esa solución pueda ser usada más de un millón de veces sin hacerlo siquiera dos veces de la misma forma”. Pero pasemos ya al área software: un patrón de diseño [1] es, pues, una solución a un problema en un determinado contexto. Tal solución es, empero, a la vez parte del “qué” y del “cómo” del sistema completo a construir: esto es, la pieza que conforma el patrón software es como la pieza del patrón de sastre que se utiliza para confeccionar vestidos y trajes, pues tal pieza, aparte de contener las especificaciones de corte y confección del producto final, representa a la vez, en apariencia, una parte de tal producto textil. Pero vayamos a un ejemplo práctico. Es usual que en el diseño de distintos sistemas software nos encontremos con similares problemas a resolver, y uno de los más frecuentes es el que nos enfrenta a un conjunto de objetos (o estructuras de datos -en fin, seamos comprensivos-) cuyo contenido debemos recorrer, objeto a objeto, con el fin de operar (comparar, coleccionar, etc.) con los valores que encontremos. Usualmente, también, la solución consiste en usar de un objeto “iterador” (o función iteradora) que recorre la colección de elemento en elemento. Pero pronto constatamos que el problema necesita una solución matizadamente distinta en cada contexto en el que se plantea: así, por ejemplo, no resulta igual iterar por una colección que por un objeto compuesto por capas envolventes, como tampoco es exactamente igual un recorrido que la conjunción concurrente de varios iteradores sobre la misma colección, ni resultan iguales los iteradores concretos que aquellos otros polimórficos, aunque, de alguna manera, la esencia de la iteración es la misma para todos los problemas de ese tipo. Aquí tenemos, por tanto, un “patrón”, conocido como “Iterador” o “Cursor”, cuya descripción podría darse de acuerdo con el siguiente esquema (extraído del libro del GOF):
Si accedemos a un catálogo que contenga este patrón (“iterador”), encontraremos que se refiere al acceso secuencial a objetos sin entrar en su representación interna: esto es, sin directamente cambiarlos. Porque resulta que si lo que queremos es actuar de alguna manera sobre los objetos a recorrer, entonces deberemos usar de otro patrón: el conocido como “visitador”. Vemos, pues, que ya existe una granulación diferencial de patrones que pretende encapsular la experiencia adquirida en muchos proyectos software de forma límpida y reutilizable. Y es que, como el lector fácilmente comprenderá, lo difícil de los patrones es precisamente descubrirlos, pulirlos y formalizarlos, porque la realidad, como una alfombra, necesita ser extendida y desenrollada para que se puedan apreciar sus “patrones”, pues si no éstos aparecen desfigurados y confusos [2]. CATÁLOGOS DE PATRONES Si aceptamos, pues, que los patrones pueden resultar útiles en el desarrollo de software, el siguiente paso es reunirlos en catálogos de forma que resulten accesibles mediante distintos criterios, pues lo que necesitamos no es tan sólo la completa descripción de cada uno de los patrones sino, esencialmente, la correspondencia entre un problema real y un patrón (o conjunto de patrones) determinado. Desafortunadamente, y a pesar de la segmentación en la exposición de los patrones detallada anteriormente, tal objetivo todavía no se ha conseguido: existen catálogos de patrones (como el libro del GOF, que se detalla más adelante), pero la capacidad de elección todavía se basa en el conocimiento completo de los mismos. Pero esto se apreciará mejor en un ejemplo. Recientemente un cliente nos enfrentó al diseño de una biblioteca genérica de impresión multiplataforma cuyo uso principal sería generar en tiempo de ejecución objetos concretos de tipo “Impresora”, con distintas implementaciones, a los que dirigir mensajes de impresión en base a un interfaz genérico predefinido. Tras el pertinente estudio estimamos que el problema básico de diseño se podía resolver utilizando dos patrones (y en esta elección influyó notoriamente el lenguaje a utilizar, C++): “Prototipo”, para diferir hasta tiempo-de-ejecución la creación de un determinado objeto impresora, clonando un objeto estático, y “Puente”, para separar el interfaz (establecido en una clase base “gruesa” que encerraría toda la funcionalidad) de las posibles implementaciones (los lenguajes de impresora) que se establecen en una jerarquía paralela aparte [3]. Naturalmente este resultado se basó en el anterior conocimiento de un suficiente número de patrones, de manera que, en realidad, si no hubieran existido patrones se habría solucionado de parecida manera, pues se trataba de problemas que ya se habían abordado anteriormente. Pero, claro, lo que se pretende con un catálogo de patrones no es favorecer al diseñador experto (que quizás no necesite en absoluto de los patrones, aunque el estudio de la formalización del conocimiento es siempre recomendable), sino más bien ayudar al diseñador inexperto a adquirir con cierta rapidez las habilidades de aquél, como también comunicar al posible cliente, si es el caso, las decisiones de diseño de forma clara y autosuficiente. Se trata, en definitiva, de un medio para comunicar la experiencia de forma efectiva, reduciendo (o aplastando) lo que sorprendentemente se conoce como “curva de aprendizaje” del diseño. ¿PATRONES ORIENTADOS-A-OBJETOS? ¿Hablamos de diseño de software o más bien de diseño-orientado-a-objetos de software? Parecería que, según lo hasta ahora visto, los patrones habrían de acoplarse bien a cualquier esquema. Bien: en teoría sí, pero en la práctica la casi totalidad de los trabajos y catálogos en este campo (como el libro GOF) se refieren a sistemas orientados-a-objetos. Parece que esto responde a que, simplemente, el “patrón de conducta” en diseño es ahora el OOD. Claro que algunos pretenderían una solución para todo [4], pero parece claro que las ideas de modularidad reutilizable en que se sustentan los patrones encuentran asiento natural en sistemas de diseño con las facilidades modulares de la orientación-a-objetos. TELEPREDICADORES DE SOFTWARE La Programación Estructurada , la Orientación-a-Objetos, y ahora ... ¡los Patrones! En la comunidad software, como en la religiosa y en la política, aparecen cada tanto soluciones pretendidamente salvadoras que ofrecen a sus postulantes cambios tan radicales que resultan tentadoramente creíbles [5]. Y es que, ¿con qué herramientas se mide la idoneidad de una teoría empírica? Usualmente infieriendo su correctitud desde exitosos ejemplos prácticos. Entonces, si examinamos los patrones, ¿por qué no examinar, en primer lugar, su aplicación en la arquitectura tradicional? ¿Por qué no estudiar los exitosos trabajos de Alexander? Pues porque el brillante prestigio teórico de Alexander (un tanto discutido en su propia área) está ligado a una desazonadora ejemplificación práctica de sus proyectos: desde inesperados -por no decir turbadores- resultados a fastuosos fracasos (como el de la comunidad de Mexicali). ¿Entonces -preguntará el ahora decididamente inquieto lector- los patrones no funcionan en arquitectura? Bueno, querido lector, piense que Alexander, en sí, no es la piedra angular de ningún sistema software. Recordemos, por ejemplo, que Collodi fue un mediocre escritor antes de “Pinoccio” y siguió siéndolo después de éste. A veces una solitaria buena idea genera resultados extraordinarios, y Alexander expone, en un inglés exaltado, varias excelentes ideas. Piénsese, también, que los hijos no resultan nunca como los padres porfían han de ser, y es que en la comunidad software a Cronos se lo comerían sus hijos sin darle tiempo siquiera a posar para Goya. Parece, por otro lado, que los patrones son “nuevos”, pero en absoluto es así, pues existen patrones-marcos formales desde hace tiempo: MVC de Smalltalk, MacApp, etc., así como patrones-de-rutinas que todos conocemos: las bibliotecas de algoritmos. Resulta, al fin, que nos encontramos en una fase incierta de captura y formalización de la rica experiencia en diseño extendida en multitud de maduros sistemas software, y aparece claro que el sentido de la marcha es irreversible. ¿Patrones? ¡Sí, pero con prudencia! PATRONES BIBLIOGRÁFICOS Hay unos cuantos textos relacionados con el tema que nos ocupa, buena parte de ellos de Alexander, naturalmente. He aquí mi selección: Notes on the Synthesis of Design, de Christopher Alexander, 1964, Harvard University Press. Este es el texto basado en la tesis doctoral de Alexander, y base, a la vez, del estudio de Alexander sobre el sistema BART, en el que el autor establece por vez primera que la funcionalidad del sistema no depende tan sólo de un conjunto de requerimientos. A Pattern Language: Towns/Building/Construction, de Christopher Alexander, Sara Ishikawa, Murray Silverstein, Max Jacobson, Ingrid Fiksdahl-King y Shlomo Angel, 1977, Oxford University Press. 253 patrones, con el formato específico propuesto por Alexander, se dan cita en este texto, en el que además se propugna una integración del mejor-vivir con el medio físico circundante: gente-gente-patrones-gente. Cuando se habla del “libro de Alexander” (CA patterns book) o del “libro AIS” (las iniciales de los primeros autores) se refieren a esta obra. The Oregon Experiment, de Christopher Alexander, 1978, Oxford University Press. Aquí se explicitan los planteamientos participativos (usuario-constructor/diseñador) puestos en práctica en el plan maestro de Berkeley de 1970. El resultado, fiel a la trayectoria práctica alexanderiana, no fue el esperado. The Timeless Way of Building, de Christopher Alexander, 1979, Oxford University Press. Junto con el de “A Pattern Language” esta es una de las obras más difundidas de Alexander. Si a estas alturas ya soportamos bien el estilo pseudo-filosófico-religioso del autor, el texto merece la lectura. The Production of Houses, de Christopher Alexander, 1985, Oxford University Press. Se relata aquí la desafortunada historia del fallido proyecto de construcción de una comunidad en Mexicali. Este texto es especialmente interesante por cuanto en él Alexander reflexiona sobre los problemas y carencias que llevaron al fracaso del proyecto. Algunas reflexiones resultan emocionalmente ingenuas (sobre todo las relacionadas con la escasa comprensión del gobierno mexicano), pero de ellas se desprende un tono de advertencia al que los nuevos apóstoles de los DPs no debieran resultar ajenos. A New Theory of Urban Design, de Christopher Alexander, 1987, Oxford University Press. Advanced C++ Programming Styles and Idioms, de James O. Coplien, 1992, Addison-Wesley. Desde su publicación he venido recomendando efusiva e insistentemente este inteligente libro a todo aquél que de verdad quiera conocer el lenguaje C++ y aun usarlo. Resulta claro ahora, como el mismo autor expresamente reconoce, que los idiomas aquí descritos son en realidad patrones, presentados empero sin formato definido. El libro es, pues, doblemente imprescindible. Design Patterns: Elements of Reusable Object-Oriented Software, de Erich Gamma, Richard Helm, Ralph Johnson y John Vlissides, 1995, Addison-Wesley. Este texto se conoce como “GOF book” o libro del GOF (Gang-of-Four: Clan-de-los-Cuatro, en evidente referencia a los autores del texto), y es sencillamente indispensable para cualquiera interesado en los patrones de diseño. Tras una adecuada introducción conceptual se introduce al lector en un caso práctico (un editor WYSIWYG) y ante los sorprendidos ojos de éste desfilan patrones donde no parecía haberlos. Seguidamente se detallan distintos patrones agrupados en tres subcatálogos: de creación, estructurales y de comportamiento, con ejemplos en C++ y Smalltalk. Por su solidez este libro puede hacer cambiar de parecer a los que pudieran pensar que es demasiado pronto para redactar un catálogo de patrones. En fin, imprescindible. Design Patterns for Object-Oriented Software Development, de Wolfgang Pree, 1995, Addison Wesley. Tras un breve examen de la historia, estado y clasificación de los patrones (patrones orientados a objetos, patrones de codificación, recetarios de marcos, contratos formales y catalógos de patrones de diseño), Pree nos adentra en los metapatrones, o piezas reusables que encierran el diseño de complejos marcos-entornos. En realidad el libro trata sobre marcos (frameworks), y sobre cómo puede encontrarse en estos (bien establecidos y maduros) un conjunto mínimo de metapatrones transportable al desarrollo de otros marcos. Pree expone siete metapatrones y después aboga por su integración en el proceso de OOA/OOD mediante lo que él mismo denomina Hot-Spot-Driven Design (HSDD: diseño enfocado-a-zonas-sensibles, en insana traducción). En esencia, una Zona-Sensible es, respecto de un escenario de diseño, un área bien delimitada susceptible de cambio (esto es, un área flexible). El texto es interesante, con varias referencias al libro GOF, pero quizás se centra demasiado en el académico ET++ (un marco para desarrollo de GUIs) obviando otros marcos comercialmente bien establecidos; a la vez, las referencias a los patrones de codificación en C++ resultan un tanto ingenuas. El libro resulta, con todo, recomendable. PATRONES ELECTRÓNICOS Después de los libros, y dados la juventud y el estado “de permanente construcción” de los patrones, el lector quizás desee tener acceso a algunas de las fuentes on-line. Helas aquí: World-Wide-Web: obviaré las referencias Gopher y de ftp-sites, que pueden ser accedidas mediante el WWW.
Listas de correo: esta es la materia viva de la que el lector podrá extraer lo último en patrones. Es aquí, también, donde se pueden exponer ideas, pedir consejos, etc.
Conferencias: aparte de las que seguidamente se mencionan hay que reseñar la sección de OOPSLA dedicada a los patrones: en realidad la mayoría de conferencias sobre Orientación-a-Objetos empiezan a considerar -si es que ya no lo han puesto en práctica- la inclusión de una sección específica de patrones.
[1] También denominado “patrón software” o “patrón generativo”. [2] ¡Vaya, esto suena profundo!, pero debo reconocer que el mérito, en traducción libre, es de Themistocles. [3] En realidad se necesitó algo más que dos patrones (como, por ejemplo, un subsistema gestor de implementaciones), pero esa es otra historia (nadie ha dicho que los patrones sean autosuficientes para completar sistemas software). [4] Es como si desearan una suerte de quinta sinfonía de Prokofiev (la fusión del clasicismo tradicional y la vigorosa modernidad), pero sólo obtuvieran el poderoso scherzo del segundo movimiento. ¡Ahí es nada! [5] Remy de Gourmont afirmaba que los hombres son tan estúpidos que dando un nombre nuevo a una cosa vieja creen haber pensado algo nuevo. Bierce, más práctico, ironizaba: “Cogito cogito ergo cogito sum”. [6] Kent Beck, que pertenece al Grupo de Patrones de Hillside, presentó en OOPSLA ‘89, junto con Ward Cunningham, las fichas CRC, como el lector orientado-a-objetos posiblemente ya sabrá. |
||
| Pº. Castellana 188, 14º e · 28046 - Madrid · info@a4devis.com |
||