UTN – F. R. Resistencia Ing. en Sistemas Diseño de Sistemas Guía de Trabajos Prácticos 10: Principio de Cohesión Aplicado Introducción La presente guía de trabajos prácticos introduce los conceptos relacionados con el principio de cohesión del diseño estructurado, incluye ejercicios destinados a determinar el grado de cohesión de uno o más módulos partiendo de su descripción o pseudocódigo, también se solicita la derivación de diagramas de estructuras a partir de DFD, cuyos módulos sean altamente cohesivos. Objetivos de la guía Lograr que el alumno: Entienda cuales son las decisiones de diseño que influyen en la cohesión de un módulo. Diferencie el grado de cohesión a través de los niveles planteados. Modalidad de Trabajo Grupal, de hasta 6 integrantes Fundamentos teóricos La cohesión es la medida cualitativa de cuan estrechamente relacionados están los elementos internos de un módulo. Otros términos utilizados frecuentemente son “fuerza modular”, “ligazón”, y “funcionalidad”. En la práctica un elemento de procesamiento simple aislado, puede estar funcionalmente relacionado en diferentes grados a otros elementos. Como consecuencia, diferentes diseñadores, con diferentes “visiones” o interpretaciones de un mismo problema, pueden obtener diferentes estructuras modulares con diferentes niveles de cohesión y acoplamiento. A esto se suma el inconveniente de que muchas veces es difícil evaluar el grado de relación funcional de un elemento respecto de otro. La cohesión modular puede verse como el cemento que amalgama juntos a los elementos de procesamiento dentro de un mismo módulo. Niveles de Cohesión Cohesión Casual (la peor): ocurre cuando existe poca o ninguna relación entre los elementos de un módulo. Cohesión Lógica (sigue a la peor): Los elementos de un módulo están lógicamente asociados si puede pensarse en ellos como pertenecientes a la misma clase lógica de funciones. Cohesión Temporal (de moderada a pobre): significa que todos los elementos de procesamiento de una colección ocurren en el mismo período de tiempo durante la ejecución del sistema. Cohesión de Procedimiento (moderada): Elementos de procesamiento relacionados proceduralmente son elementos de una unidad procedural común. Una unidad procedural común puede ser un proceso de iteración o de decisión, o una secuencia lineal de pasos. Cohesión de Comunicación (moderada a buena): se da cuando todos los elementos operan sobre el mismo conjunto de datos de entrada o de salida. Los diagramas de flujo de datos (DFD) son un medio objetivo para determinar si los elementos en un módulo están asociados por comunicación. La cohesión por comunicación es común en aplicaciones comerciales. Ejemplos típicos pueden ser “un módulo que imprima o grabe un archivo de transacciones” o “un módulo que reciba datos de diferentes fuentes, y los transforme y ensamble en una línea de impresión”. Cohesión Secuencial: los datos de salida (resultados) de cada elemento de procesamiento sirven como datos de entrada al siguiente elemento de procesamiento. En términos de un diagrama de flujo de datos de un problema, la cohesión secuencial combina una cadena linear de sucesivas transformaciones de datos. Cohesión Funcional (la mejor): en un módulo completamente funcional, cada elemento de procesamiento, es parte integral de, y esencial para, la realización de una función simple. Ing. Germán Gaona 1/8 Ing. Valeria Sandobal IMPORTANTE: Desde el punto de vista de la medición de la cohesión respecto del módulo podríamos definir que: la cohesión de un módulo es aproximada al nivel más alto de cohesión que es aplicable a todos los elementos de procesamiento dentro del módulo. Criterios para establecer el grado de cohesión Una técnica útil para determinar si un módulo está acotado funcionalmente es escribir una frase que describa la función (propósito) del módulo y luego examinar dicha frase. Puede hacerse la siguiente prueba: Si la frase resulta ser una sentencia compuesta, contiene una coma, o contiene más de un verbo, probablemente el módulo realiza más de una función; por tanto, probablemente tiene vinculación secuencial o de comunicación. Si la frase contiene palabras relativas al tiempo, tales como “primero”, “a continuación”, “entonces”, “después”, “cuando”, “al comienzo”, etc., entonces probablemente el módulo tiene una vinculación secuencial o temporal. Si el predicado de la frase no contiene un objeto específico sencillo a continuación del verbo, probablemente el módulo esté acotado lógicamente. Por ejemplo “editar todos los datos” tiene una vinculación lógica; “editar sentencia fuente” puede tener vinculación funcional. Palabras tales como “inicializar”, “limpiar”, etc., implican vinculación temporal casual. A continuación se presenta otro método basado en un cuadro que podría servir como guía para la determinación del nivel de cohesión de un módulo. 2/8 UTN – F. R. Resistencia Ing. en Sistemas Diseño de Sistemas Ejercicio 1 Determine el nivel de cohesión de los módulos que se enuncian a continuación en base a las descripciones textuales correspondientes. Módulo AftIn1 AftIn2 GenRept Descripción Textual Ingresa los ítems de control, los suma, y verifica totales. Ingresa ítems de control, graba cinta de prueba, suma ítems de control, verifica totales. Genera reportes: de ventas, de estado del proyecto, o de transacciones de clientes. SintCh Chequea la exactitud de la sintaxis de una oración. OutTran Imprime una transacción y la copia a disco con igual formato. UpCredOut Actualiza el registro de crédito corriente y lo graba en disco. StartIt Abre archivos, obtiene el primer registro de transacción y maestro, e imprime la cabecera de página. NewTran Actualiza registro en el archivo y obtiene la siguiente transacción CircDisp Redondeo_en_5 (numero) Tratar_Suba_Dolar (precio) Generar_Lista_XML JustificarDerecha TratarDeudores ActualizarPrecios (IncFijo, IncPorc) Ing. Germán Gaona Cohesión Produce el diagrama del circuito a partir de una matriz de conexión. Procedimiento que contiene una estructura condicional múltiple, que de acuerdo al valor decimal del numero recibido, Si es menor a 0,30, entonces devuelve el mismo número sin decimal Si es igual a 0,50, entonces devuelve el mismo número con decimal 0,50 Si es mayor a 0,50, entonces devuelve el numero incrementado en uno, sin decimal Procedimiento que recibe el nuevo valor del dólar y actualiza la lista de precios (en pesos) multiplicando el valor en dólares del producto por el nuevo precio recibido. Además actualiza el almacén que contiene el precio del dólar con que se calcularon los precios. Procedimiento que, primero lee el almacén PRECIO_DEL_DOLAR, en base a esto, actualiza el almacén LISTA_DE_PRECIOS y en base a este almacén genera un documento XML con los precios actualizados de cada artículo. Dada una cadena de texto como entrada devuelve otra cadena de texto con un relleno de espacios en blanco a la izquierda hasta completar una cierta longitud dada también como entrada. Recorre el almacén de deudores y obtiene la cantidad de deudores y el monto de la deuda total Procedimiento de actualización de precios que recibe un incremento fijo y un porcentaje de actualización, para los artículos de Categoria1 aplica el incremento fijo, mientras que para el resto de los artículos utiliza el porcentaje de actualización 3/8 Ing. Valeria Sandobal Ejercicio 2 Suponiendo que las siguientes frases describen módulos, determine el grado de cohesión de cada uno. Justifique su respuesta: a. Se arman las líneas de impresión de los distintos informes que se necesita obtener. __________________________________________________________________________________________ __________________________________________________________________________________________ __________________________________________________________________________________________ b. Primero se obtienen todos los registros de compras de un determinado proveedor, después se toman los pedidos no recibidos y se calcula el monto adeudado. __________________________________________________________________________________________ __________________________________________________________________________________________ __________________________________________________________________________________________ c. En un proceso de liquidación de sueldos, se toma la cantidad de días trabajados, se multiplica por pago diario y se le retienen los adelantos. La salida es el sueldo neto. __________________________________________________________________________________________ __________________________________________________________________________________________ __________________________________________________________________________________________ d. Se limpian las variables del sistema para que no queden datos del proceso que se ha realizado. __________________________________________________________________________________________ __________________________________________________________________________________________ __________________________________________________________________________________________ Ejercicio 3: Escenario El programa que se presenta a continuación corresponde a la implementación de una estructura modular, cuyo objetivo es obtener una estadística impresa de ocurrencias de fallas en máquinas tragamonedas. Para ello existen dos almacenes de datos: FALLAS, que contiene un registro por cada falla posible, con los campos cod_f, nomb_f y costo_f y el almacén NOVFALLAS, que contiene un registro por cada falla que se produce y entre los campos que lo componen el único relevante para el proceso en cuestión es falla_n que indica el código de la falla producida. Ambos almacenes se encuentran ordenados por código de falla. Se propone procesar secuencialmente NOVFALLAS, con un corte de control por código de falla. INICIO Total, testigo, gen, marca, totcosto, gencosto: enteros HACER inicializar(total, gen, marca, totcosto, gencosto) HACER apertura LEER Novfallas AL FIN marca:=1 Testigo:=falla_n HACER proceso(total,testigo,marca,gen,totcosto,gencosto,falla_n) MIENTRAS marca=0 HACER corte(testigo, total, gen, totcosto, gencosto,falla_n) HACER imprimo(”TOTAL GENERAL”, gen, gencosto) HACER final FIN 4/8 UTN – F. R. Resistencia Ing. en Sistemas Diseño de Sistemas RUTINA inicializar(total, gen, marca, totcosto, gencosto) Total:=0 Marca:=0 Gen:=0 Totcosto:=0 Gencosto:=0 RUTINA apertura ABRIR fallas ABRIL novfallas RUTINA proceso(total, testigo, marca, gen, totcosto, gencosto,falla_n) SI testigo = falla_n HACER acumular(total) LEER novfallas AL FIN marca:=1 CONTRARIAMENTE HACER corte(testigo, total, gen, totcosto, gencosto,falla_n) FIN SI RUTINA acumular(total) Total:=total + 1 RUTINA corte(testigo, total, gen, totcosto, gencosto,falla_n) BUSCAR testigo EN fallas HACER calcosto(totcosto, costo_f) HACER imprimo(nomb_f, total, totcosto) Gen:=gen+total Gencosto:=gencosto+totcosto Total:=0 Totcosto:=0 Testigo:=falla_n RUTINA calcosto(totcosto, costo_f) Totcosto:=totcosto+costo_f RUTINA imprimo(nomb_f, total, totcosto) IMRIMIR nomb_f + “ ” + total + “ ” + totcosto RUTINA final CERRAR fallas CERRAR novfallas Consigna Evalúe el grado de cohesión que presenta cada uno de los módulos especificados. Ejercicio 4 Escenario Dado un sistema existente en un colegio secundario que contiene los siguientes almacenes: Especificación de Almacenes ALUMNOS @Legajo Nombre Domicilio MATERIAS @CodMat Descripcion CURSOS @CodCur Descripcion CALIFICACIONES @CodMat @CodCur @Legajo Trimestre_1 Trimestre_2 Trimestre_3 MATERIASXCURSOS ALUMNOSXCURSOS @CodMat @Legajo @CodCur @CodCur Se desea agregar una funcionalidad que permita, a partir de un curso ingresado por el Director, calcular el promedio (entre los tres trimestres) de cada materia de cada alumno, para luego obtener el promedio final para cada alumno en todas las materias y emitir un informe impreso que incluya todos los alumnos del curso ingresado con su promedio. Diagrama de Flujo de Datos de Nivel 0 Director Ing. Germán Gaona curso Emitir Promedio por Alumno 5/8 informe Promedio por Alumno Ing. Valeria Sandobal Diagrama de Flujo de Datos explotado CURSOS Ingresar Curso Director cursoInforme curso Buscar Curso curso cursoInforme ALUMNOSXCURSOS legajo cursoInvalido errorCursoIngres Validar Curso codCurso Busleer Alumno CALIFICACIONES codCurso+legajo ALUMNOS Mostrar Error legajo tri1+ tri2+tri3 Busleer Calificaciones codMat+tri1+ tri2+tri3 codMat alumno Buscar Alumno Calcular Promedio Materia curso Acumular Cantidad Materias legajo+nombre promxMatxAlum Imprimir Informe informe Acumular Promedios informePromedios Armar Informe Promedio por Alumnos promFinalxAlum totalPromxAlum cantMaterias Calcular Promedio Final Consigna 1. Realice agrupamientos de burbujas indicando para cada uno de ellos el grado de cohesión. Justifique. 2. Plantee un DE modular para el DFD propuesto, usando como guía los agrupamientos hechos. 3. Refine el DE utilizando el principio de acoplamiento y otras buenas prácticas vistas en clase. 6/8 UTN – F. R. Resistencia Ing. en Sistemas Diseño de Sistemas Ejercicio 5 Escenario Debe obtenerse una planilla con el detalle de minutos trabajados por el personal de la empresa. Se dispone de dos almacenes con las siguientes estructuras: EMPLEADOS = {Empleado} Empleado = Nro_legajo + Nombre + MinJornada NOVEDADES = {Novedad} Novedad = Nro_legajo + Fecha + Hora_ingreso + Hora_egreso + 1er_egreso + 1er_retorno + 2do_egreso + 2do_retorno + 3er_egreso + 3er_retorno Ambos almacenes son de acceso secuencial y están ordenados por el campo Nro_legajo. El almacén EMPLEADOS contiene un registro por cada empleado y el almacén NOVEDADES, contiene un registro por cada día trabajado por empleado. Diagrama de Flujo de Datos propuesto (ver DFD siguiente página) Se propone realizar un apareo de ambos almacenes por Nro_legajo y calcular por cada empleado: minutos diarios trabajados minutos diarios excedentes / faltantes (minutos diarios trabajados – MinJornada) duración de cada parte de salida total de minutos diarios salidos total de minutos realmente trabajados total de minutos excedentes / faltantes La planilla de salida debe presentar el siguiente formato: Primera línea: Nro de legajo, nombre, minutos de la jornada. Detalle: Por cada novedad emitir: Fecha, Hora ingreso, Hora egreso, 1er salida duración, 2da salida duración, 3er salida duración, Total salidas, Minutos diarios realmente trabajados, Minutos excedentes / faltantes Línea de totales: o Total de minutos trabajados en el mes o Total de minutos excedentes / faltantes Consigna: 1. Realice agrupamientos de burbujas indicando para cada uno de ellos el grado de cohesión. Justifique. 2. Plantee un DE modular para el DFD propuesto, usando como guía los agrupamientos hechos. 3. Refine el DE utilizando el principio de acoplamiento y otras buenas prácticas vistas en clase. Ing. Germán Gaona 7/8 Ing. Valeria Sandobal EMPLEADOS NOVEDADES empleado novedad Leer Empleados empleado novedad Leer Novedades Comparar legajo Hora_Ingreso + Hora_Egreso Calcular Minutos Brutos 1er_egreso + 2do_egreso + 1er_retorno 2do_retorno Calcular 1er Salida 3er_egreso + 3er_retorno Calcular 2da Salida salida1 Calcular3er Salida salida3 salida2 empleado MinBrutosTrab Calcular Minutos Trabajados TotalSalidas novedad Sumar Salidas TotalSalidas Armar Encabezado Empleado Armar Detalle Nov Empleado MinNetosTrab MinJornada detalle MinDesvio encabezado Calcular Desvio Min Acumular Min Netos Trabajados MinNetosAc Armar Totales Empleado totales Imprimir informe MinDesvio MinDesvioAcum Acumular Desvio Min Planilla Bibliografía Page-Jones, M. (1988). The Practical Guide to Structured Systems Design (2nd Ed.). Prentice Hall. Yourdon, E.; Constantine, L. (1979). Structured Design: Fundamentals of a Discipline of Computer Program and Systems Design. Yourdon Press. McConnell, S. (2004). Code complete: A practical handbook of software construction (2nd ed.). Redmond, Wash.: Microsoft press. Torossi, Gustavo. Apunte de Diseño Estructurado. 8/8