La cuestión es: ¿Necesito realmente Java para Internet? Es decir: dado que Java no es sino a la vez un subconjunto y batiburrillo de cualidades de otros lenguajes, ¿no podríamos usar un lenguaje pretendidamente “serio” con otro subconjunto de tales cualidades para las cuitas de Internet, prescindiendo así de Java? La respuesta es … ¡No! “¿No?” -exclamará algún self-made lector- “¿Cómo que no?” ¡Ah, caro lector, es que, cuando menos, ya no podemos prescindir de los applets! Lo cierto, y esto resulta evidente para cualquiera que acceda aún mínimamente a Internet, es que Java ha impregnado el contenido [1] de la información que por allí se encuentra o pulula: los applets, la interacción con visores con capacidades Java, los esquemas de composición de Java Beans con el resto del universo y la difusa idea que Java es, a la vez, el vehículo y los ocupantes, configuran una visión de Internet en la que Java es imprescindible. Y es que el planteamiento es parecido al que nos enfrenta a realidades incontestables cuando intentamos abordar el almacenamiento y recuperación de datos: ficheros POSIX, bases de datos relacionales, bases de objetos, etc.: es lo que hay. “Bien, bien: de acuerdo” -ruge el impaciente lector- “Java no puede obviarse. Vale ¿Y qué más?”. Oh, muchísimo más. Y es que, si Java existe, ¿por qué no integrarlo en los viejos sistemas [2]? Es decir, ¿por qué no tender hacia un modelo de integración de Java en otros lenguajes en vez de considerar Java como el punto de convergencia de los lenguajes en sí? O sea, ¿por qué no codificar en C++ y usar los recursos de Java cuando sea aconsejable o necesario? Y es que Java aún no es una dictadura (donde todo lo que no estuviera prohibido sería obligatorio, como reza el dicho anónimo). Claro que C++ necesita echar mano de bibliotecas, y lo que aquí mentamos suena demasiado grandilocuente: un enorme conjunto de clases que proporcione a C++ características para las que no fue diseñado, sin poder modificar el lenguaje en sí, de forma que se troque en el lenguaje natural de Internet. Oh, ciertamente, el objetivo es, por una cuestión de prudencia, simplemente inabordable. Otra cosa es que nos centremos en algunos aspectos sectoriales de Internet más asequibles. Vamos a dedicar, así, nuestro énfasis a las páginas web construidas en HTML. WEB<TOOLKIT> TM Una de las maldiciones de C++ fue su liberación en el mercado sin un conjunto apropiado de bibliotecas normalizadas [3], de forma que las cuitas multiplataforma, de construcción gráfica y otras -incluso de multi-enhebramiento-, han tenido más que ver con la pericia y disposición comercial de cada uno de los implementadores que con las verdaderas necesidades de los usuarios considerados como comunidad. Siguiendo con este enfoque de segmentación de posibles interfaces, inevitablemente ligado a la codificación en C++, he aquí la enésima biblioteca de clases que nos permitirá … ¡escribir páginas web usando C++! Pero, esperen, antes de abordar los aspectos técnicos permítanme relatarles mi aproximación a esta biblioteca, mis esperanzas guerrilleras, mis decepciones reales y mis posteriores sentimientos huxleyanos de felicidad. ORGULLO Y PREJUICIO Yo conocía a ObjectSpace Inc por el buen temprano trabajo que realizaron con la adaptación de la STL C++ en su producto STL<ToolKit> TM, que llegué a recomendar desde esta revista merced a la oportunidad y elegancia de sus algoritmos de ayuda. Naturalmente cuando supe de su nuevo producto dedicado a conceder a C++ parte de la funcionalidad tan anhelada en Internet, y además basado en su anterior implementación STL, inmediatamente les pedí una copia licenciada, con la que he estado trabajando durante algunos meses. La cuestión es que, y es ahí donde encuentra su sentido el título Austeniano, yo tenía las mismas expectativas que cuando cambié del cifrado al solfeo en guitarra, pues de muy joven llegué a pensar que el solfeo me haría entrar en otra dimensión interpretativa, cuando realmente sólo me hizo mejorar y afinar el tempo. ¡Ah, la ignorancia! Bien: pues resulta que el uso de Web<ToolKit> TM, acoplado al del compilador (en éste mi caso: Microsoft Visual C++ [4]), finalmente me causó una matizada desilusión, tras la cual pude realmente apreciar, como en el solfeo, la bondad de su enfoque. En primer lugar no se trata de una idea genial (y esto, visto el pasmo de Java, quizás sea una ventaja), sino de una extensión natural de ciertas bibliotecas C++. En segundo lugar: el entorno de uso de esta biblioteca es sentidamente distinto del que necesita de programación directa HTML. Finalmente, el producto cubre un hueco de integración difícilmente rellenable con otros lenguajes. Pero veamos en qué consiste exactamente este conjunto de clases, sobre las que el lector curioso puede encontrar información adicional en “http://www.objectspace.com” EL ROSARIO COMERCIAL Web<ToolKit> TM es una biblioteca de clases que facilita la codificación en C++ de programas CGI (Common Gateway Interface) y documentos HTML, con los siguientes beneficios:
CGI, APPLETS Y HTML Como puede fácilmente apreciarse, las ventajas prometidas se segmentan en dos vertientes: por un lado se simplifica la creación y mantenimiento de programas CGI y por otro … “¡Eh, un momento!” -salta aquí el lector hiperinformado- “los scripts CGI tienden a desaparecer, sobre todo porque con los applets Java y …” ¡Alto, alto! De momento dudo mucho que la comunicación con los servidores vía CGI desaparezca, tal y como están actualmente las cosas (y obviaré aquí la discusión que incluye IIS y otras soluciones). Otra cuestión es que tales scripts sean codificados en Java o C++. Y, claro, esto es precisamente lo que nos ocupa. Bueno, decía que siempre es ventajoso sustituir un lenguaje de puro script por otro lenguaje completo orientado-a-objetos (sea éste C++ o aun Java), con lo cual el beneficio deviene tangible. La otra genérica mejora se refiere a la codificación de documentos HTML. En realidad lo que hace Web<ToolKit> TM es embeber las construcciones típicas HTML en clases correspondientes, de manera que finalmente se genera puro código HTML. He aquí tal correspondencia básica:
Es evidente que la correspondencia de nombres es trivial (a excepción del prefijo “os_” que obedece al ánimo de evitar colisiones de nombres sin usar “namespaces”). Pero, ¿cómo enlazar todo esto con una página HTML? Pues mediante la clase “os_page”, que representa una página web (en este caso sin marcos). Se trata de crear (instanciar) un nuevo objeto de tipo os_page e ir añadiendo (insertando) secuencialmente los distintos objetos de las clases anteriormente expuestas, de tal manera que finalmente volcaremos el contenido de tal objeto os_page en un dispositivo de salida, y en tal vuelco el objeto os_page traducirá su contenido de objetos C++ a script HTML. Pero veamos un ejemplo. CONCEPTOS BÁSICOS La arquitectura de la biblioteca es prudentemente simple: todas las clases, a excepción de “os_form_map”, derivan de la clase “os_element”, que representa la unidad de composición. Incluso la clase “os_element_group”, base del manejo de los tipos agregados como listas, tablas, etc., deriva de “os_element” [5]. En cuanto a su uso, se basa en la inserción ordenada de tales elementos (os_element) en una página (os_page). Pero vayamos por partes. Lo primero es crear una “os_page” que represente la página web, y en este caso se aprovecha una sobrecarga del constructor para añadirle el título:
Lo siguiente es insertar en la página recién creada distintos elementos (en este caso una línea de texto):
También podríamos haber usado, simplemente, la sobrecarga de operadores respecto de la clase os_page:
o simplemente
o quizás, usando de un identificador intermedio,
toda vez que la función add(…) y el operador << respecto de os_page están sobrecargados para admitir, entre otras cosas, bien cadenas de caracteres bien elementos de texto (una especificidad de os_element). Hay que notar que cada cadena de las así insertadas se concatenará con la anterior en la forma ¡Puedo escribir directamente en español!: ÁÉÍÓÚÑáéíóú pues para dotar de bloques y formato al texto habría que usar los os_elements apropiados (os_paragraph, etc.). Note de paso el lector la facilidad con que hemos codificado una frase con caracteres que requieren etiquetas no intuitivas en HTML. Finalmente, para convertir todo lo anterior en código HTML, lo único que hay que hacer es volcar la página os_page en el objeto cout (see-out, para quien lo haya olvidado):
Claro que, ¿cómo se compatibiliza este volcado con la generación de HTML desde un programa CGI? ¡Pues simplemente! La clase os_page contiene un enumerador:
de forma que si cambiamos el tipo de salida a “cgi”, bien como último parámetro en cualquiera de los constructores de os_page, bien utilizando la función
a el stream de salida se le añadirá la etiqueta de contenido MIME siguiente “Content-Type: text/html”. LA CONSABIDA PORCIÓN DE CÓDIGO Vayamos con un ejemplo típico de texto informático [6], con el que se intentarán mostrar algunas de las capacidades de la biblioteca:
C++ Y APPLETS JAVA ¿Cómo integrar applets Java en nuestra página? Pues tan fácilmente como se inserta un os_applet (derivado de os_element) en una os_page:
Como se ve, el primer parámetro del constructor de os_applet es el nombre del fichero de clase Java correspondiente (code), seguido por la longitud en pixels del ancho (width) y alto (height) de la zona en que se ejecutará el applet. Existe otro constructor que añade la URL base del applet (codebase). Respecto del alineamiento del applet se utiliza el enumerador “alignment”. Existen además funciones de establecimiento y lectura para cada uno de los parámetros ya reseñados y también para hspace (los pixels de espacio horizontal que bordean el applet) y vspace (lo mismo que hspace, pero referente al espacio vertical, claro). ¿Qué ocurre, con todo, con los parámetros que pudieran pasarse desde la página web al applet? Bueno, sólo necesitamos instanciar uno o más objetos de tipo os_parameter e insertarlos, de nuevo, en el os_applet correspondiente:
Aquí vemos cómo se insertan dos parámetros en nuestro applet, de forma que cada uno de ellos está caracterizado en el correspondiente constructor por el nombre del atributo al que se pretende asignar el valor que le sigue. ¡ENVIDO Y YO! Como el lector ya habrá podido adivinar, Web<ToolKit> TM incorpora muchas otras clases que, en la práctica, encapsulan el grueso de la funcionalidad necesitada para la creación y el mantenimiento de páginas web. Podemos hablar, así, del control de errores, que posibilita la visualización de errores HTML de forma consistente e independiente del visor web en cada caso utilizado; citar, también, las clases dedicadas a tablas y tablas anidadas, así como las que representan marcos que permiten segmentar el área de la página web en zonas de distintos tamaños porcentuales y posiciones relativas, a las que además se les puede asignar nombres y pueden ser asociadas al resultado de hiperenlaces (sobre todo para visualización de resultados); nombrar las clases dedicadas a la representación de elementos de formularios, como botones, campos de edición, cajas combo, etc. Cabría resaltar, también, una importante característica de la biblioteca: todas las clases, por el hecho de derivar, directa o indirectamente, de os_element heredan la función “key(String)”, que se usa para asignar un nombre a cualquier elemento a insertar en una página web. El sentido de esta asignación es permitir la aplicación de funciones de búsqueda y reemplazo sobre elementos de la página (mediante las funciones find_first(), find_all(), remove_first(), remove_all(), replace_first() y replace_all(), todas disponibles en cualquier clase derivada de os_element, y que usualmente devuelven un puntero al os_element o grupo de os_elements resultado de su aplicación), tal y como puede verse en el siguiente ejemplo:
Naturalmente este enfoque tiene muchas más posibilidades: podríamos usar un vector STL para almacenar el resultado de la aplicación de la función “find_all( String key )” en una os_page, y luego iterar sobre ellos (con un iterador STL) para aplicar cualquier tipo de posicionamiento gráfico o procesamiento sintáctico. De hecho la posibilidad de nombrar elementos permitiría agrupar con una misma clave distintos contenidos de similar valor semántico, de manera que nos resultará mucho más fácil mantener la coherencia de nuestra página ante cambios y re-estructuraciones. CONCLUSIONES “Bueno, todo sonó muy lindo, pero ¿para qué demonios necesito yo esta biblioteca cuando ya dispongo de excelentes editores WYSIWYG para HTML?” -exclama el hirsuto lector ofimático. ¡Pues para programar, naturalmente! En definitiva se trata de C++, y esto sugiere que el fin de la biblioteca es ser usada en un entorno de desarrollo, no como mera herramienta de visualización sustitutiva de Java, como la metadona del caballo o el bourbon del escocés. En realidad esta herramienta es enormemente práctica para generar dinámicamente páginas web, como por ejemplo en una típica respuesta de un programa CGI, codificado mediante Web<ToolKit> TM, a un formulario de entrada en una página web, pues la página generada usualmente tiene que ver con la interacción del usuario respecto del formulario (por ejemplo: “le faltó su número de tarjeta VISA” u “olvidó su teléfono, señorita”). Piense el lector que el embebimiento de HTML en su código “usual” puede provocar más de un mareo, así que la idea de la continuidad C++ no suena en absoluto descabellada. Claro que … ¿esto mismo podría hacerse en Java? ¡Ciertamente! Pero eso es otra historia [7]… REFERENCIAS DIRECTAS
[1] Java es “el contenido incontinente”, si atendemos a Hal Fraiser. Claro que otra posibilidad sería aplicar a Java lo que Toddi pensaba del Esperanto: “un cóctel que se cree océano”. Ya ven, pura incontinencia. [2] Se trata del enfoque “realista”. Uno puede dudar de un mundo básicamente homosexual, pero resulta difícil explicar por qué el ejercito norteamericano, por ejemplo, se niega a integrar en sus filas a lo que constituye una realidad social y humana que en absoluto puede obviarse. ¿Java y la homosexualidad? Bueno, no me negarán que la comparación tiene posibilidades (vamos, que tiene su “aquél” ;-) [3] Esto, que yo encuentro tremendamente razonable, tiene multitud de detractores, y es una de las principales causas de la demora del estándar C++. [4] Ya ven que no tengo empacho en utilizar todos los compiladores que se crucen en mi camino. Claro que cualquier otra estrategia distinta a este puro proxenetismo es delicadamente peligrosa. Recuerdo que en una reciente reunión y ante la pregunta “¿qué compilador recomienda?” aconsejé que se compraran todos, y … no, no me echaron a patadas. [5] Se trata, en definitiva, del conocido esquema de glyphs de Calder, que mediante un patrón de composición permite representar estructuras sofisticadas en documentos. El lector interesado en un mayor detalle sobre esta estructura colaborativa de objetos puede revisar el patrón “Composite” del libro GOF de patrones de Diseño que se detalla en las referencias del artículo. [6] El símil más cercano que jamas haya encontrado en relación a los ejemplos de juguete que aparecen en las obras informáticas es la definición de Freire de una modelo: “señorita que, por lo general, constituye un mal ejemplo”. [7] Parafraseando a Lenny Bruce podría afirmarse que cuando alguien alcanza el poder una de sus primeras tareas es identificar (e incluso crear) una minoría a la que odiar. Definitivamente Java y C++ están en onda. ¿O era Sun y Microsoft? |
|||||||||||||||||||||||||||||||||||
| Pº. Castellana 188, 14º e · 28046 - Madrid · info@a4devis.com |
|||||||||||||||||||||||||||||||||||