Desarrollo Software Gran Escala Herramientas de Desarrollo (Parte 3: Generadores y Constructores)
Diferentes tipos de herramientas Controladores de versión Ambientes de desarrollo Pruebas y Depuración Documentación Generadores de código Constructores
Generadores de código (CG) Diferentes Lenguajes, Arquitecturas y frameworks soportados Algunos pocos generan full aplicación Diferentes fuentes: Desde UML Desde un MER Ambiente gráfico Posibilidad de ingeniería inversa
Caso de Ejemplo (Java) Se desea generar una aplicación con acceso a una BD por medio de EJB. De tienen dos equipos: Uno para la capa de BD y otro para la GUI. Primero se construye la capa de BD que incluye la lógica Los EJB s se construyen desde cero
Caso de estudio: Construcción de la capa de BD El modelo esta representado en un archivo XML (generado desde una herramienta UML) El generador toma el archivo XML como entrada el cual contiene las tablas y campos de la BD. Lo anterior alimenta una plantillas donde se define como generar EJB s para la BD objetivo, incluyendo los SQL necesarios (técnica conocida como Model-Driven Generation)
Caso de estudio: Generación de páginas de prueba Se incluyen unas plantillas para generar las paginas JSP de pruebas que permiten acceder a los EJB s Las páginas de prueba observan el archivo SQL de inicialización de la BD Algunas de estas páginas se llevan a producción
Caso de estudio: Generación de la GUI Se utiliza un generador especifico para la GUI Se generan los JSP y la interfaz SWING Se parte de una definicion manual de las interfaces
Caso de estudio: Como se genera la GUI Se utiliza las definiciones de entidades (las mismas de los EJB s) junto a la definición manual de la GUI como entradas al generador
Caso de estudio: Se agrega la generación de GUI Se integra el generador de GUI, el cual toma parte de su información del generador de BD Construye tanto la parte Web (JSP) como la de escritorio (Swing)
Beneficios de CG para ingenieros Calidad: Grandes volumenes de código escrito a mano tiende a una calidad inconsistente El uso de plantllas estandariza el proceso por lo que las mejoras al código se pueden aplicar consistentemente a través de todo el código base Consistencia: El código construido con un generador es consistente con sus API s y el nombramiento de variables facilitando su uso y entendimiento Un cambio en una nombre de una tabla en un solo punto permite regenerar el esquema, la capa de objetos, la documentación y demás artefactos de desarrollo
Beneficios de CG para ingenieros (2) Más tiempo para el diseño: Se puede dedicar mas tiempo para razonar sobre el uso de las API s y del framework No obstante, el tiempo ganado debe ser utilizado para reescribir las plantillas y integración de partes generadas consistentemente con la arquitectura, si es el caso del generador utilizado. Consistencia con la Arquitectura: CG encauza a los programadores para mantenerse dentro de la arquitectura Documentación: Apoya las labores más tediosas de documentación y su mantenimiento
Buenas practicas para CG Preste atención al código escrito a mano: Puede existir codificación especial en algunos casos que no es posible hacerle ingeniería Entienda el framework para el cual está generando código Una forma de entenderlo es escribiendo código a mano para dicho framework Haga control al código fuente: Es muy importante proteger él codigo escirto a mano a través de un controlador de versiones robusto Considere el lenguaje para el CG: El generador y el código generado no necesariamente debén estar bajo el mismo lenguaje Integre el generador en todo el proceso de desarrollo Considere integrarlo a su ambiente de desarrollo (IDE)
Algunos CG populares Oracle Application Express (Oracle/Java) CodeSmith (.Net/C#) Codify (.NET/C#) Velocity (Java) Symphony (PHP) UML2PHP (PHP) Code Charge (PHP, Java) XDoclet (Java/XML) Acceleo (MDA, multiples plataformas)
Constructores Son herramientas de apoyo a la generación o automatización de construcción y compilación de código Su finalidad es construir archivos ejecutables o programas, entendibles por la plataforma sobre la cual se ejecuta resolviendo dependencias a otros archivos (bibliotecas, API s, etc.) Además son utilizados para la automatización de otras tareas como la creación de documentación, mantenimiento del sistema (borrado de archivos temporales, por ejemplo), etc.
Caso de Estudio: Apache Ant Ant es un proyecto de código abierto de la Apache Software Foundation. Es una herramienta usada para la realización de tareas mecánicas y repetitivas, normalmente durante la fase de compilación y construcción (build). Es similar a Make pero sin las engorrosas dependencias del sistema operativo. Ofrece la ventaja de no depender de las órdenes de shell de cada sistema operativo, sino que se basa en archivos de configuración XML y clases Java para la realización de las distintas tareas, siendo idónea como solución multi-plataforma. Esta hecha en Java
Ejemplo Ant: Hello World En un archivo build.xml se definen tres objetivos - clean, compile y jar, cada uno de los cuales tiene una descripción asociada y las dependencias entre acciones para lograrlo El archivo se ejecuta con una línea de comandos invocada con el ejecutable de Ant y una serie de parametros opcionales para ajustar la compilación según lo deseado (por ejemplo, solo limpiar, o solo compilar, etc.)
Ejemplo Ant: Archivo build.xml
Caso de Estudio: Maven Es una herramienta software para la gestión de proyectos Java de la Apache Software Foundation. La versión 1 se basá en un fichero de configuración en XML (project.xml) y una serie de plugins, Esta herramienta permite: Compilar el proyecto Java Ejecutar los tests unitarios Generar paquetes (jars, wars, ears o distribuciones en zip) Generar reportes de desarrollo.
Caso de Estudio: Maven (2) La versión 2 usa también un fichero de configuración en XML llamado pom.xml. Su funcionalidad es parecida a Apache Ant pero con la diferencia que trata de forma automática las dependencias del proyecto. Una de las más importantes características es su actualización en línea mediante servidores de repositorios. Maven es capaz de descargar nuevas actualizaciones de las bibliotecas de las que depende el proyecto y de igual manera subir una nueva distribución a un repositorio de versiones, dejandola al acceso de todos los usuarios.