Unidades prácticas de Ingeniería del Software Diseño estructurado 3ª edición (2000) Facultad de Informática
diseñando el software El diseño estructurado es un método de diseño de software concebido por Page-Jones. El método debe aplicarse después de analizar el software mediante un método estructurado (p.e. método de Yourdon). El diseño del software se plantea como la organización de los módulos (procedimientos y funciones) para conseguir la funcionalidad descrita en el análisis; por ello, este método se considera dentro de la categoría de los métodos orientados por la función. El método proporciona un conjunto de herramientas para la representación del diseño del software, la organización de las actividades de diseño y criterios para comprobar la calidad del diseño. Diseño estructurado 2
contenido Parte I. Herramientas de representación Parte II. Guía de diseño Referencias bibliográficas Diseño estructurado 3
parte I. herramientas de representación Representación del diseño Diagrama de estructura Diagrama de estructura: ejemplo Especificación de módulos por interfaces Especificación de módulos por pseudocódigo Diseño estructurado 4
representación del diseño El método del diseño estructurado proporciona dos herramientas para representar el diseño: Diagrama de estructura, con el que se representa la estructura modular del software (diseño arquitectónico). Lenguaje de especificación de módulos, con el que se describe los detalles procedimentales de cada módulo, existiendo dos alternativas posibles: especificación de las interfaces de módulos o especificación por pseudocódigo. Estas herramientas permiten dividir el trabajo entre los miembros de un equipo de desarrollo al estar orientadas modularmente. Diseño estructurado 5
diagrama de estructura N Módulo Invocación o transferencia de control X Parámetro de entrada T Módulo contenido dentro del padre N N Módulo de librería Subsistema Invocación iterativa Activación de subtarea concurrente Conector Y Z F Parámetro de salida Parámetro de entrada/salida Flag T E F G Datos Módulo transaccional Agrupación de módulos Diseño estructurado 6
diagrama de estructura: ejemplo Main Realizar llamada ClearScreen Comunicador Número teléfono Iniciar modem Marcar nº Conexión Transferencia Desconexión EP Mensaje Comando Número teléfono (pag. n) (pag. n+1) Realizar llamada EP Write Escribir puerto Fichero: matra.unit Diseño estructurado 7
especificación de módulos por interfaces Interfaces de módulos Se define lo que se espera de un módulo como si fuera una especie de contrato. Se especifica para cada módulo: los datos de entrada, su propósito y la salida que se espera. Esta forma permite al diseñador definir la funcionalidad de un módulo sin entrar en excesivos detalles. La estructura de los datos se identifica al margen. Ejemplo Módulo. Seleccionar sitio de pasajeros. Propósito. Elegir para cada cliente el sitio que cumpla los requisitos de su clase y preferencias. Usa. Preferencias_sitio. Devuelve. Sitio_seleccionado, Preferencias_disponibles. Detalles funcionales. Buscar entre los sitios disponibles aquellos que cumplan las condiciones en el siguiente orden: clase, fumador y fila. Estructura de datos Preferencias_sitio Clase_asignada Fumador Fila *Primera, Negocios, Turista *S/N *Pasillo, Medio, Ventana Diseño estructurado 8
especificación de módulos por pseudocódigo Pseudocódigo Es una forma más detallada de describir un módulo. Con un lenguaje formal estructurado se especifica cómo tiene que funcionar el módulo. Al ser más detallada que la especificación de interfaces tiene un menor margen de error, pero implica más trabajo para el diseñador. No obstante, la especificación por pseudocódigo se puede complementar con la especificación de interfaces. Ejemplo Módulo. Seleccionar sitios de pasajeros. Call ObtenerPrimerSitio(Sitio,NoHaySitios) While Not NoHaySitios Comprobar Sitio con Preferencias_sitio Si es valido Añadir a la Lista_sitios Call ObtenerSiguienteSitio(Sitio,NoHaySitios) EndWhile Mostrar la lista al usuario para que seleccione el número de sitio. Accept Numero_sitio Sitio_seleccionado=Lista_sitios(Numero_sitio) Return Sitio_seleccionado Diseño estructurado 9
parte II. guía de diseño Estrategia Actividades Medidas Heurísticas Diseño estructurado 10
estrategia Las especificaciones desarrolladas durante el análisis estructurado pueden ayudar a derivar la estructura del diseño. La transición desde el diagrama de flujo de datos a la estructura del programa, representada en el diagrama de estructura, requiere la identificación del tipo de flujo de información. Flujo de transacción Flujo de transformación T Entrada Transformación Salida Diseño estructurado 11
actividades Si es transformación Aislar el centro de transformación de los procesos de entrada y salida. Realizar el primer nivel de factorización. Si es transacción Identificar el centro de transacción. Establecer una estructura software adecuada para el procesamiento de transacciones. Controlar Controlar Leer Procesar Emitir Leer datos Invocar Ejecutar el segundo nivel de factorización, convirtiendo los procesos de DFD en módulos de la estructura. Refinar la estructura resultante usando medidas y heurísticas de diseño. Desarrollar la estructura de cada una de las transacciones, incorporándola a la estructura anterior. Refinar la estructura resultante usando medidas y heurísticas de diseño. Diseño estructurado 12
medidas La cohesión y el acoplamiento son dos medidas que permiten evaluar la calidad de la partición de los módulos y, por lo tanto, ayudan a refinar el diseño. Un buen diseño se caracteriza por un acoplamiento bajo, es decir, poca interdependencia entre módulos, y una cohesión alta, significando que los elementos que componen un módulo están muy relacionados. Estas cualidades permiten reducir los errores y mejorar la comprensión del diseño, facilitando, por lo tanto, la tarea de mantener el software. Mejorar la cohesión Para asegurar que las funciones del software reflejen las originales y así facilitar la comprensión. Partir módulos que realicen actividades poco relacionadas entre sí. Asignar a los módulos tareas de control o de trabajo. Mejorar el acoplamiento Para reducir la posibilidad de transmisión de errores (efecto ripple) entre módulos. Eliminar relaciones innecesarias. Reducir el número de relaciones. Facilitar la claridad de las relaciones. Diseño estructurado 13
heurísticas Factorizar Separar la funcionalidad de un módulo en varios módulos. Reducir el tamaño de los módulos. Minimizar la duplicidad de código. Proporcionar módulos de uso general. Mejorar la cohesión. Formar estructuras reconocibles Tender hacia estructuras con formas básicas (p.e., entrada, transformación y salida) o estructuras inspiradas en las propias estructuras de datos. Inicialización y terminación Iniciar y terminar cada función en el momento preciso (evitar funciones de inicializar y terminar todo). Compromiso entre restrictividad y generalidad Los módulos muy restrictivos son difíciles de reusar. Los módulos muy general son muy complejos y poco eficientes. Reducir el número de subordinados Un módulo que posea más de siete módulos subordinados dificulta su comprensión. Diseño estructurado 14
referencias bibliográficas Yourdon, E. Modern Structured Analysis. Prentice-Hall, 1989. Page-Jones, M. Practical guide to structured systems design. Prentice-Hall, 1988. Pressman, R.S. Ingeniería del software. Un enfoque práctico. McGraw-Hill, 1993. Diseño estructurado 15