it-is1. Práctica 1-1. Diseño arquitectónico “Todos los sistemas cambian durante sus ciclos de vida. Esto debe tenerse en mente cuando se pretende que los sistemas desarrollados perduren más de la primera versión”. Ivar Jacobson Introducción El diseño es la primera etapa técnica del proceso de Ingeniería del Software, consiste en producir un modelo o representación del software que se va a desarrollar. El diseño debe ser una guía que puedan leer y entender los que programan y prueban el software. En el diseño arquitectónico se definen las relaciones entre los elementos estructurales o módulos de nuestro programa. Entendemos que los módulos son los elementos básicos de programación y podemos pensar en ellos como las funciones, procedimientos, tipos de datos o paquetes de un programa. El diseño modular efectivo reduce la complejidad, facilita los cambios y produce como resultado una implementación más sencilla, permitiendo el desarrollo paralelo de las diferentes partes del sistema. Un buen diseño se caracteriza por módulos con una clara función en los que se evita una excesiva interacción con otros módulos: alta cohesión y bajo acoplamiento. Criterios de diseño modular Descomposición Modular. Descomponer el problema de software en un pequeño número de sub-problemas menos complejos, interconectados mediante una estructura sencilla y suficientemente independientes para permitir que el trabajo futuro pueda proseguir por separado en cada uno de ellos. Composición Modular. Los módulos del software deben poderse combinar libremente unos con otros para producir nuevos sistemas, posiblemente en un entorno bastante diferente de aquel en que fueron desarrollados inicialmente. Comprensibilidad Modular. Los módulos del software se deben entender sin tener que conocer los otros, o en el peor caso, teniendo que examinar sólo unos pocos de los restantes módulos. Continuidad Modular. Un cambio en la especificación del problema provoca sólo cambios en un solo módulo o en un pequeño número de módulos. Protección Modular. Una situación anormal que se produzca dentro de un módulo durante la ejecución queda confinado a dichos módulos o en el peor caso se propaga sólo a unos pocos módulos vecinos. Objetivos En esta práctica, se pide realizar un diseño arquitectónico en el que se identifiquen y definan claramente los módulos que deben ser implementados para el desarrollo de una aplicación que permita realizar búsquedas de vuelos. Los requisitos son los siguientes 1. Para realizar la búsqueda se debe poder indicar el número de pasajeros (adultos y niños) que van a realizar el viaje, preferencias del vieja en cuanto a la clase (turista, preferente o primera), horario (mañana, tarde, noche) 2. Los viajes pueden ser tanto de ida como de ida y vuelta. 3. Los resultados de la búsqueda deben ordenarse por el precio. 4. Los resultados de la búsqueda pueden ofrecer tanto vuelos directos como vuelos con escalas. 5. Si el cliente es flexible en las fechas de salida o regreso, el sistema debiera encontrar alternativas de vuelo más económicas. El resultado que deberá se entregado debe ser un documento en el que se incluyan los siguientes contenidos: Diagrama de estructura modular, en el que se muestren claramente los módulos y las dependencias entre estos módulos Descripción de cada módulo (rutinas, tipos de datos o paquetes) explicando respectivamente su funcionalidad, estructura o contenido Consejos y recomendaciones 1. Diseñar no es escribir código. 2. Hay que identificar el lenguaje que se vaya a programar la aplicación. El diseño es muy dependiente del lenguaje de programación. 3. El diseño debe presentar uniformidad. 4. Los nombres de los módulos deben reflejar claramente su funcionalidad y contenido. 5. Debe estructurarse para ser reutilizado. Para potenciar la reutilización del código, se deben crear paquetes en los que se incluyan las funciones que puedan ser comunes a éstos programas. 6. Debe estructurarse para admitir cambios. Para facilitar los cambios, deben preverse posibles ampliaciones o modificaciones de los programas que se solicitan en primera instancia. 7. Debe estructurarse para permitir la portabilidad. Para garantizar la portabilidad de las aplicaciones, se deben crear paquetes para incluir las funciones que puedan ser dependientes de la plataforma.