Fundamentos de Desarrollo de Sistemas Unidad VI FUNDAMENTOS DE DESARROLLO DE SISTEMAS UNIDAD VI DISEÑO Y ARQUITECTURA DE PRODUCTOS DE SOFTWARE Se refiere a determinar como funcionará de forma general sin entrar en detalles. Consiste en incorporar consideraciones de la implementación tecnológica, como el hardware, la red, etc. 6.1 DESCOMPOSICIÓN MODULAR. Descomposición Modular o Modularización es el proceso de descomposición de un sistema en un conjunto de elementos con un índice bajo acoplamiento (independientes) y alto índice de cohesión (con significado propio). Consiste en descomponer el problema a resolver en módulos o tareas más simples. Cada tarea representa una actividad completa y se codifica de manera independiente. Facilita el diseño descendente del problema, centrándonos cada vez en la resolución de subproblemas de magnitud inferior. A la resolución de cada uno de estos subproblemas de complejidad inferior se denomina refinamiento por pasos. Los módulos pueden ser planificados, codificados, comprobados y depurados independientemente, y a continuación se combinan uno a uno con otros módulos. Abstracción procedimental. Con este concepto se hace referencia a la necesidad de separar el propósito de un subprograma de suimplementación. Consideraciones. Cada algoritmo que resuelve el diseño de un módulo equivale a una caja negra que ejecuta una tarea determinada. Cada caja negra especifica lo que hace pero no cómo lo hace. Cada caja negra puede utilizar a cualquiera de las demás cajas negras. Normalmente, estas cajas negras se implementan como subprogramas: procedimientos y funciones. Instituto Tecnológico de Ciudad.Juárez 95 Fundamentos de Desarrollo de Sistemas Unidad VI Abstracción de datos. Pretende separar el concepto de datos y operaciones necesarias para operar con los datos, de su representación e implementación respectivamente. La materialización de este concepto son los Tipos de Datos Abstractos (TDA) que se definen como una colección de datos y un conjunto de operaciones sobre estos datos. Ocultamiento de información. Facilitará las diversas abstracciones, ocultando y evitando que se pueda acceder a la representación e implementación de los módulos y TDA. Se consigue haciendo uso de facilidades aportadas por el lenguaje de programación. Programación orientada a objetos Paradigma de programación que hace uso de todos conceptos anteriores y algunos más para el desarrollode software. Descomposición modular mediante diseño descendente. Cuando crece un programa las tareas de programación se hacen más difíciles. La diferencia entre un programa modular grande y pequeño influye solamente en el número de módulos. Tiene un impacto positivo en los siguientes aspectos de programación: Construcción del programa. Pueden trabajar diversos desarrolladores gracias a la independencia de los módulos. Depuración del programa. Se centrará en cada uno de los módulos por separado y posteriormente se comprobará la interacción. Legibilidad del código. Eliminación de código redundante. Objetivo: Conseguir una visión del software como una estructura jerárquica de módulos E(P1 U P2)> E(P1) + E(P2) Instituto Tecnológico de Ciudad.Juárez 96 Fundamentos de Desarrollo de Sistemas Unidad VI Ideas fundamentales. Reducir el esfuerzo de desarrollo. Separación entre estructuras de datos y procedimientos. Independencia funcional: Cada módulo debe realizar una tarea concreta que afecte lo menor posible al resto. Ocultamiento de Información: La información de un módulo es inaccesible para el resto de módulos. Ventajas. – Evita la propagación de errores – Facilita las interfaces e independiza la codificación Conceptos. – Acoplamiento: Grado de interdependencia de los módulos – Cohesión: Grado del alcance de la tarea de un módulo Criterios a seguir durante el diseño. – Reducir acoplamiento – Aumentar la cohesión – Conseguir módulos con interfaces sencillas Figura: Programción Modular Instituto Tecnológico de Ciudad.Juárez 97 Fundamentos de Desarrollo de Sistemas Unidad VI Figura: Diagrama de Estructura. Ejemplo: Descomposición Modular en C (I) /** @file gestionsimple.c @brief Gestión simple de cuentas bancarias @version 3.1 */ #include <stdio.h> #include <conio.h> /*Variables Globales y constantes*/ const iva=0.16; /* DEFINICIONES DE FUNCIONES Y PROCEDIMIENTOS */ void S_Inicial (float *inicial); void Proceso (float inicial, float *actual, int *pag, int *ing); void Informe (float inicial, float actual, int ing, int pag); void Leer (char *tipo, float *cantidad); void Actualizar (char tipoOper, float cantidad, float *actual, int *ing, int *pag); /* PROGRAMA PRINCIPAL */ void main (void) { float saldoInicial, saldoActual; int ingresos, pagos; /* llamada al procedimiento Inicial */ S_Inicial (&saldoInicial); /* llamada al procedimiento Proceso */ Proceso (saldoInicial, &saldoActual, &ingresos, &pagos); /* impresion de resultados : informes */ Informe (saldoInicial, saldoActual, ingresos, pagos) }; Instituto Tecnológico de Ciudad.Juárez 98 Fundamentos de Desarrollo de Sistemas Unidad VI Ejemplo: Descomposición Modular en C (II). /** @brief Visualiza instrucciones al usuario y lee saldo inicial */ void S_Inicial (float *inicial) { printf ("Control de una cuenta corriente\n\n"); printf ("Opciones a introducir en cada caso\n"); printf ("i (Ingreso), p (Pago), f (Fin programa)\n\n"); printf ("Introduzca saldo inicial "); scanf ("%f",inicial) }; /** @brief Proceso de cada operación */ void Proceso (float inicial, float *actual, int *pag, int *ing) { char tipoOper; /*tipo de operacion : ingreso/deposito o pago*/ float cantidad; /*inicializar contadores a cero y saldoActual a saldoInicial*/ *ing = 0; *pag = 0; *actual = inicial; Leer (&tipoOper, &cantidad); /*lectura primera operación*/ while (tipoOper != 'F') { Actualizar (tipoOper, cantidad, actual, ing, pag); Leer (&tipoOper, &cantidad); }; }; Ejemplo: Descomposición Modular en C (III). /** @brief Imprime salarios inicial, final y número de operaciones */ void Informe(float inicial, float actual, int ing, int pag) { printf ("Saldo inicial : %f \n", inicial); printf ("Saldo final : %f \n", actual); printf ("Numero de ingresos realizados : %.0d \n", int); printf ("Numero de pagos realizados : %.0d \n", pag); }; /** @brief Lectura de cada operación */ void Leer (char *tipo, float *cantidad) { printf("i (ingreso); p (pago); f (fin) \n"); do { scanf("%c",tipo); } while ((*tipo!= ‘i’)&&(*tipo!=’p’)&&(*tipo!=’f’)); if (*tipo != ‘f’) { printf ("Cantidad a procesar \n"); scanf("%.0f",cantidad) }; }; Instituto Tecnológico de Ciudad.Juárez 99 Fundamentos de Desarrollo de Sistemas Unidad VI Ejemplo: Descomposición Modular en C (IV). /** @brief Actualiza saldo actual e incrementa el contador Ingresos y Pagos */ void Actualizar ( char tipoOper, float cantidad, float *actual, int *ing, int *pag ) { switch (tipoOper) { case 'i': { *actual += cantidad; *ing++; printf ("Ingreso la cantidad %.1f \n", cantidad); printf ("Saldo actual : %.1f \f \n", *actual); break; }; case 'P': { *actual -= cantidad; pag +=1; printf ("El pago efectuado es de %.0f \n", cantidad); printf ("Saldo Actual : %.0f \n", *actual); break; }; default: { printf ("Operacion no valida %c ignorada \n" , tipoOper); }; }; if (*actual < 0) { printf ("Precaucion, descubierto en cuenta \n"); }; }; Abstracción y encapsulamiento Idea principal: Definir una parte de un sistema de modo que puede ser comprendido por si mismo, como una unidad, sin conocimiento de sus detalles específicos. Solo será necesario saber el modo de interaccionar con dicha unidad. Dos tipos: • Abstracción procedimental Los módulos se ven como cajas negras con una determinada funcionalidad que a su vez pueden hacer uso de otras cajas negras. Instituto Tecnológico de Ciudad.Juárez 100 Fundamentos de Desarrollo de Sistemas Unidad VI • Abstracción de datos Los datos son vistos como elementos sobre los que se pueden realizar un conjunto de operaciones predefinidas. En ningún momento se tiene conocimiento de su representación o implementación de las operaciones. Modificabilidad Una buena descomposición modular facilitará la modificabilidad del código. Pequeños cambios en los requisitos de un programa modular normalmente requieren un cambio pequeño sólo en algunos de sus módulos. Vendrá condicionado por los siguientes aspectos: – Acoplamiento débil. Los módulos deben ser independientes entre sí. – Cohesión fuerte. Las tareas de cada módulo deben estar bien definidas. Se debe perseguir que los cambios debidos a modificaciones afecten a la menor cantidad de módulos posible. 6.2 ARQUITECTURAS DE DOMINIO ESPECÍFICO (DSSA). Son arquitecturas diseñadas para cubrir un sistema o una familia de sistemas pero muy centradas en un área o dominio determinado y enfocadas a la reutilización. Pasos para su construcción: 1. Definición del dominio. 2. Definición de requisitos y conceptos del dominio específico. 3. Definición de restricciones de implementación del dominio. 4. Desarrollo de modelos y arquitecturas del dominio. 5. Generación de productos reutilizables. Instituto Tecnológico de Ciudad.Juárez 101 Fundamentos de Desarrollo de Sistemas Unidad VI Arquitecturas de Software Reutilizables El objetivo principal es poder reutilizar partes de una arquitectura, modelos arquitectónicos, arquitecturas de referencia o componentes de la misma de manera que no sea necesario volver a diseñar el modelo completo. Utilizan componentes reutilizables y se obtienen, generalmente, mediante procesos de Ingeniería del Dominio. De esta forma es posible obtener un ahorro de costes y tiempo en la creación de nuevos sistemas de software. 6.2.1 Diseño de Software de Arquitectura Multiprocesador. Instituto Tecnológico de Ciudad.Juárez 102