La Ingeniería del Software aplicada a la web requiere una inversión inicial para “hacer las cosas bien”, mientras más vueltas a la cabeza le das a un problema, más manejo cogemos para solucionarlo en un futuro, además de mejorar nuestro ingenio y agudizar nuestras habilidades.
Desde hace mucho tiempo que programamos en PHP o cualquier otro lenguaje al nivel del software Orientado a Objetos, para este artículo he utilizado como bibliografía el libro “Design Patterns” de la élite-grupo formada por: Erich Gamma, Richard Helm, Ralph Johnson y John Vlissides de la editorial Addison Wesley. Es más, en la mayoría de enlaces que pongo a la Wikipedia se copian literalmente (bueno no literalmente porque se traducen del inglés al español) toda la teoría de este libro, directamente. Ahora además , ¡veremos la parte práctica!
¡¡Pero primero, …un poco de teoría!!
Ya os estaréis preguntando de qué demonios va esto de los patrones de diseño y cómo los podemos utilizar en la construcción de una aplicación web para hacer el proceso, si cabe, más divertido :] …para explicarlo, se debe de conocer primero qué es un patrón de diseño, concretamente deberíamos conocer el Modelo-Vista-Controlador o bien,MVC, alguna de sus variantes y, llegado este punto, recordar lo que es un catálogo de patrones de diseño, a los que pertenecen los siguientes:













Organizando el catálogo
Ahora que conocemos el contenido del catálogo de los patrones de diseño, debemos saber más acerca de su espacio, es decir, a qué ámbito, qué propósito tienen, donde enmarcarlos en definitiva a la hora de utilizarlos. Como hemos visto en sus descripciones, hay objetos y clases, algunas clases son abstractas, por lo que necesitan ser construidas desde otra clase que sí se puede instanciar y que hereda de la primera sus características. En el caso de las clases , según su propósito tenemos para crear contenido el patrón Factory Method, para estructurar el mismo elegimos el Adapter (Adaptador) y como comportamiento los patrones de diseño de clases: Interpreter y Template Method.
Sin embargo, a la hora de seleccionar qué patrones de diseño utilizar para enfocar los objetos, encontramos para el apartado creativo los patrones: Abstract Factory, Builder, Prototype y Singleton; en cambio, para el estructural : de nuevo podemos coger al Adaptador, Bridge, Composite, Decorator, Facade, Flyweight y Proxy. En el caso de los comportamientos de los objetos: Chain of Responsability, Command, Iterator, Mediator, Observer, State, Strategy, Visitor.

¡¡Pasamos a un ejemplo práctico!!
Un ejemplo de software libre que usa patrones de diseño para comunicar un servicio de vídeo de Flash con un objeto Flash incrustado en un HTML con comunicación asíncrona por XML (con AJAX) es AMFPHP, un ejemplo de profesionales utilizando patrones de diseño en una aplicación Flash con esta plataforma es: Digital Tutors.
Ahora que somos unos amos de los patrones veamos un ejemplo, saber cuáles de ellos nos harán falta es sencillo, para este ejemplo vamos a construir un generador de formularios, como por ejemplo el de Fabrik, en PHP.
Para empezar necesitamos una clase principal que utilice el patrón Singleton, para ello lo único que tenemos que hacer es crear una clase llamada Singleton (en un alarde de imaginación) con una variable estática llamada instancia y comprobar en la función constructor si dicha variable está vacía, entonces creamos una instancia de la clase Singleton que almacenamos en aquella, en otro caso no,evidentemente…aunque, personalmente, prefiero guardar punteros (pese a que dicha práctica no se continúe en PHP5 y 6 [deprecated]), echad un vistazo a este framework.
Ahora que tenemos una clase principal (usando el patrón Facade para poder crear una clase para presentar el contenido y otra para administrarlo) , $web, vamos a asignarle un modelo de datos del patrón MVC modificado con el uso del patrón Composite, en este caso es una clase llamada $formularios, y su vista (o visualizador) asociémosla a la anterior y llamémosla clase $html_formularios, sirve de conexión con las plantillas HTML de modo que usaremos un patrón Bridge como controlador incrustado en el visualizador o vista, así, se pueden crear distintas implementaciones para controlar las acciones de los formularios generados, ejemplo: al enviar un formulario para almacenar datos en la base de datos que se apliquen distintos filtros a cada campo. Dichos campos siguen el patrón Abstract Factory, y para pasar de un tipo a otro, por ejemplo de un tipo campo de texto a un tipo área de texto (<input type=”text”/> a <textarea/>) utilizamos un patrón Adapter, evidentemente, para construir los campos usamos un Builder.
Esta clase abstracta Builder debe encargarse de crear las reglas de actualización de estados, es decir, de las dos posibilidades que hay: notificar automáticamente a los objetos asociados cuando el estado interno de un campo cambia o dejar que el usuario lo haga, tomamos la primera para evitar dar más trabajo al programador y realmente no es mucho más ineficiente hacer las notificaciones automáticas puesto que no hay demasiados objetos en un formulario que dependan de otros y además tenemos las reglas en cascada del sistema de base de datos (llaves externas). La clase Builder se llama dentro de cada constructor de cada Modelo de Datos y se denomina $constructor, que toma los campos que lee el Modelo de datos de la base de datos y construye las Chain of Responsibility en función de su esquema de llaves (Foráneas o Externas, Primarias) ,para construir dicho esquema podéis usar la herramienta de vuestro motor de sistema de base de datos. En mi caso uso MySQL Workbench, aquí un ejemplo con activadores (triggers): revisión 1. Finalmente, la relación queda almacenada en una estructura de datos de la clase del Modelo de datos y en este caso usamos un funciones aunque lo mejor sería hacerlo con otra clase que encapsularíamos mediante el patrón Command o incluso podríamos usar un patrón Decorator para hacer lo mismo que hago en mi caso pero añadiendo las funcionalidades extra en los objetos.

Para crear los formularios asociados al modelo de datos donde se recogen un conjunto de campos se puede utilizar un patrón Factory Method, de modo que usaremos Iterators y Mediators para conectar $formularios asociados a la clase principal $web con las clases del patrón Factory Method, así, usando la configuración de un esquema de formulario (aquí se puede usar el patrón Strategy) almacenado en la base de datos podemos matener una correlación con los datos insertados por los usuarios de forma transparente e inteligente. Para mostrar dichos datos usaremos Visitor de forma que se pueden mostrar datos en distintos formatos sin modificar el visualizador del MVC. Si en nuestra administración queremos poner un comando deshacer, podemos asociar un patrón Memento, pero debe de estar unido a un patrón Observer, para que cuando un campo cambie, cambie los formularios asociados a este así como los campos que son interdependientes, ejemplo: un listado de pacientes de un hospital, si cambiamos en una hoja del historial el tamaño de su campo Nombre o el contenido del mismo, (además de actualizarse en cascada por el esquema de la base de datos) debe notificarse al resto de objetos implicados.
La intención de este post es comenzar con la primera iteración en el proyecto para construir webs usando Ingeniería del Software sin tener que perder tiempo de desarrollo, sino, más bien, haciendo las cosas bien desde el principio y para que las próximas veces ni tan siquiera tengamos que preocuparnos por la base para empezar a implementar la web.
Para la versión JavaScript y JQuery de los patrones de la web usad el siguiente libro.
* Actualización (Junio 2011): Libros recomendados en este servidor: Code as Design de Jack Reeves – Presenta la noción de que la programación es fundamentalmente una actividad de disco y que solo al final como representación de este diseño se encuentra el código en sí mismo. Y el otro libro es : Managing the Development of Large Software Systems de Winston Royce – ilustrativo documento donde se explica genialmente el proceso de diseño de software tal como debería ser el ciclo de desarrollo como una cascada de agua “waterfall”.
La usabilidad de una aplicación web es mucho más fácil de revisar utilizando un Inventario de Contenido, es decir, una lista del contenido de un sitio web, y, si usamos una clase principal con referencias (punteros) a las clases que construyen la plataforma de información web nos será más fácil acceder al contenido para elaborar dicha lista.
He desarrollado sitios web donde el contenido ha sido adquirido gracias a las entradas de los usuarios, sus propias búsquedas son las generadoras de datos…, sus necesidades crean un punto de referencia que se ha tenido en cuenta en la Arquitectura de la Información, almacenándose para ser utilizadas en próximas visitas.
Para organizar dicha información se utilizan estructuras de datos, normalmente matrices (vector
es) de varios tipos que almacenan el texto de una búsqueda, su url en formato amigable para los buscadores, el números de veces que se ha repetido la misma búsqueda y otros datos opcionales como la fecha y la hora de la petición/creación de una nueva entrada en la tabla de información, nombre del usuario, procedencia, idioma, etc.
Al observar este informe APEI sobre Usabilidad me he llevado una grata sorpresa al descubrir que el esquema de wireframe utilizado para una web:
es precisamente el que utilizo en mis aplicaciones web,
Ejemplo 1:
Ejemplo 2:
Existen un conjunto de herramientas muy útiles para diseñar la AI fácilmente:
Teoría aplicable de la Arquitectura de la Información:
Presentaciones sobre AI:
Plantillas para desarrollo de contenidos:
Plantillas Wireframe
Si os haceis preguntas sobre la diferencia al construir aplicaciones web entre un ingeniero informático y un informático que ha estado estudiando en el nivel de Formación Profesional o un Ciclo Formativo Superior, éstas se encuentran en la escalabilidad y eficiencia de un sistema de aplicaciones. Hay quien dice que una aplicación de escritorio no tiene mucho que ver con una aplicación web, pero lo cierto es que cada vez más, estas últimas van substituyendo a las primeras, y sino, mirad los últimos paquetes de programas de Google o Microsoft.
Hablando con profesionales de la programación de Microsoft he comprendido la importancia de tener una educación universitaria para realizar el mismo trabajo con la habilidad de un ingeniero y no cabe duda que el trabajo de los ingenieros y doctorados de Google es bastante bueno…
Para explicarlo pondré un ejemplo: las unidades de prueba o también conocidas en inglés como Unit Test. Normalmente , la gente de Microsoft no suele hacerle mucho caso a las prácticas de la Ingeniería del Software, de hecho, conocí a una eminencia de la programación de Microsoft una vez en una presentación que expuso, le pagaban por dar charlas sobre .Net en las Universidades, en los Microsoft University Tours; tenía una gran pasión por lo que hacía, escribió un libro…y precisamente uno de los profesores de mi Escuela de Informática lo tenía y lo había estado analizando…casi todas las páginas contenían comentarios sobre errores comunes de la teoría de la programación, eficiencia en tiempo y en espacio, escalabilidad, elegancia del código, …un horror…
Así que no me extrañó cuando leí un artículo que se anunciaba como “It’s OK Not to Write Unit Tests!“, donde su autor, Chris, empleado de Microsoft, dice que Unit Test sólo es un test, una prueba…bien, esto es un error, una unidad de prueba no sólo sirve para ver que una refactorización ha funcionado, para conseguir encontrar bugs o mejorar el diseño inicial en cualquiera de sus fases; porque esto es una forma de intentar economizar esfuerzos a vistas de la empresa para demostrar que hemos perdido mucho tiempo a causa de un motivo sólido: la creación de estas unidades de prueba. Sin embargo, no menciona por ningún lado que sirve para probar que el programa responde como se espera en todos los casos, i.e., desde el caso base a cualquiera de las opciones que necesitan de una entrada y una salida.
En el IV Concurso Universitario de Software Libre (donde presenté 3 proyectos consecutivos: MüchiGame, zenphp y PIE) se está debatiendo intensamente sobre si la Ingeniería del Software es necesaria vesus la necesidad de ganar dinero vendiendo productos versus la necesidad de un Colegio de Informáticos que certifiquen dichos productos como de calidad así como asignar un responsable para el diseño del mismo.
En cualquier caso, hace un tiempo escribí sobre cómo mejorar las prácticas de la Ingeniería del Software orientado a aplicaciones web, además de cómo hacer Unit Tests, concretamente con PHP.
Aquí os dejo un pdf para aprender a usar PHPUnit:
Otra demostración de cómo se puede adaptar el framework zenphp.
En este ejemplo multilenguaje desarrollado para el Departamento de Filología Inglesa y Alemana de la Universidad de Granada se utilizan categorías con subcategorías sin límite, como extra, se pueden añadir programas en ellas así como una contraseña para limitar la visibilidad además de asociar ficheros y documentos.
Otro programa diseñado a medida en este proyecto es el de búsqueda de profesores, la versión actual utiliza AJAX para mostrar todos los docentes cuyos apellidos empiezan por la letra seleccionada, además se puede observar la cantidad de campos personalizables y ficheros adjuntos que trae cada perfil incluída la imagen del usuario.
Las categorías editables se van colocando en el orden establecido dentro de un menú dinámico en javascript así como ,al entrar en cada una de ellas aparecen sus artículos y subcategorías en varios niveles.
El contenido multimedia se puede incrustar fácilmente gracias a los editores HTML online o WYSIWYG (What you See Is What You Get), con estilos prefijados por CSS compartidos entre clientes y administradores de la aplicación web de departamentos de universidades.
El diseño es de Agencia Q4.