Oposiciones TIC · Ingeniería del Software

Diseño de Programas

Diagramas estructurados · Análisis de transformación y transacción · Cohesión y acoplamiento

0
Introducción al Diseño Estructurado
Contexto: El diseño estructurado (Yourdon, Constantine, Myers — años 70-80) es el conjunto de técnicas orientadas a descomponer un sistema software en módulos bien definidos, minimizando las interdependencias entre ellos y maximizando la cohesión interna de cada uno. Es la base del diseño orientado a funciones, complementario al diseño orientado a objetos.

Conceptos fundamentales

ConceptoDefinición
MóduloUnidad lógica y física del software con un nombre, función bien definida, entradas y salidas. Puede ser un procedimiento, función, subrutina, etc.
Descomposición funcionalProceso de dividir el sistema en subsistemas y módulos de menor tamaño y complejidad
AbstracciónCapacidad de tratar un módulo como una caja negra, sin necesidad de conocer su implementación interna
Independencia funcionalPropiedad deseable: cada módulo realiza una función concreta y bien delimitada con mínima interacción con otros módulos
Ocultación de informaciónPrincipio de Parnas: los detalles de implementación de un módulo no deben ser visibles desde fuera

Métricas de calidad del diseño

Los dos criterios principales para evaluar la calidad de la descomposición modular son:

Cohesión (maximizar)

Mide el grado de relación entre los elementos internos de un módulo. A mayor cohesión, mejor diseño.

Acoplamiento (minimizar)

Mide la dependencia entre módulos. A menor acoplamiento, más fácil de mantener y reutilizar.

1
Diagramas Estructurados
Definición: El diagrama estructurado (Structure Chart) es la representación gráfica de la arquitectura modular de un programa. Muestra los módulos, sus relaciones jerárquicas (llamadas) y los datos que se intercambian entre ellos.

Elementos del diagrama estructurado

ElementoSímbolo / RepresentaciónSignificado
MóduloRectángulo con nombreUnidad de software (función, procedimiento). El nombre describe su función
Módulo de libreríaRectángulo con franja inferior dobleMódulo reutilizable, compartido por varios módulos superiores
Llamada (invocación)Flecha sólida de padre a hijoEl módulo padre invoca al módulo hijo
Datos (parámetros de datos)Flecha con círculo relleno (●)Dato de entrada/salida que se transmite entre módulos
Flags (indicadores de control)Flecha con círculo vacío (○)Parámetro de control (boolean, código de estado) que altera el flujo
Bucle (iteración)Arco sobre las llamadas a módulos hijosEl módulo padre llama repetidamente a uno o varios hijos
Selección (alternativa)Rombo sobre las llamadas alternativasEl módulo padre llama a uno u otro módulo hijo según condición

Ejemplo conceptual de diagrama estructurado

Estructura típica de un programa de gestión de pedidos:

GESTIONAR PEDIDOS
LEER PEDIDO
PROCESAR PEDIDO
VALIDAR CLIENTE
CALCULAR IMPORTE
ACTUALIZAR STOCK
EMITIR FACTURA
FORMATEAR DATOS
IMPRIMIR

Jerarquía de módulos · Las flechas representan llamadas del módulo padre al hijo

Propiedades estructurales clave

PropiedadDescripciónValor deseable
Fan-out (abanico de salida)Número de módulos a los que un módulo llama directamenteEntre 3 y 9. Fan-out alto → módulo sobrecargado
Fan-in (abanico de entrada)Número de módulos que llaman a un módulo dadoFan-in alto es bueno → módulo reutilizable
Profundidad (depth)Número de niveles de la jerarquíaNi demasiado plana (fan-out muy alto) ni demasiado profunda (difícil seguir)
Anchura (width)Número máximo de módulos en un mismo nivelEquilibrada
Regla práctica: Un fan-out mayor de 7±2 suele indicar que el módulo hace demasiadas cosas (baja cohesión). Un fan-in alto (módulo muy llamado) es positivo porque indica reutilización.

Notación de Yourdon-Constantine vs DeMarco

AspectoYourdon-Constantine (SC)DeMarco (DFD → SC)
Punto de partidaDiseño directo de la estructura modularDerivación a partir del Diagrama de Flujo de Datos (DFD)
Flujos de datosMarcados explícitamente en el SCSe mapean desde el DFD usando análisis de transformación/transacción
Uso principalDiseño general de la arquitecturaDiseño en contexto de metodología estructurada completa
2
Análisis de Transformación
Definición: El análisis de transformación (Transform Analysis) es una técnica para derivar un diagrama estructurado a partir de un DFD cuando el sistema se puede modelar como un flujo de datos que pasa por una transformación central. Es la estrategia de diseño aplicable cuando hay un flujo lineal: entrada → proceso central → salida.

Concepto de flujo de transformación

Un DFD exhibe flujo de transformación cuando se puede identificar claramente:

Parte del DFDDescripciónEn el SC derivado
Flujo de entrada (afluente de entrada)Datos que fluyen desde las fuentes externas hacia el interior del sistema, pasando por transformaciones de entradaSe convierte en módulos de entrada
Transformación central (centro de transformación)El "núcleo" del sistema: los procesos que realizan la función principal, alejados de la frontera de entrada/salidaSe convierte en módulos de proceso central
Flujo de salida (afluente de salida)Datos que fluyen desde el centro hacia los destinos externos, pasando por transformaciones de salidaSe convierte en módulos de salida

Pasos del análisis de transformación

1
Revisar el modelo fundamental del sistema

Partir del DFD del sistema con sus procesos, flujos, almacenes y entidades externas correctamente definidos.

2
Revisar y refinar el DFD para el software

Asegurarse de que el DFD sea una representación correcta del sistema a nivel de diseño. Añadir detalles si son necesarios.

3
Determinar si el DFD tiene flujo de transformación o de transacción

Si el DFD tiene una transformación central dominante → análisis de transformación. Si hay un punto de despacho a varias corrientes → análisis de transacción.

4
Aislar la transformación central

Identificar el límite entre los flujos de entrada y el centro de transformación, y entre el centro y los flujos de salida. Es el paso más subjetivo y crítico.

5
Realizar la primera descomposición de nivel superior

Crear un módulo de control principal con tres ramas: módulo coordinador de entrada, módulo de transformación central y módulo coordinador de salida.

6
Descomponer cada rama

Desarrollar cada rama siguiendo la estructura del DFD, creando submódulos para cada proceso del DFD correspondiente.

7
Refinar el diagrama estructurado

Aplicar heurísticas de diseño para mejorar la cohesión, reducir el acoplamiento y ajustar el fan-out de cada módulo.

Estructura típica resultante del análisis de transformación

MÓDULO PRINCIPAL
(Coordinador general)
OBTENER DATOS
(Módulos de entrada)
LEER
VALIDAR
TRANSFORMAR
(Centro de transformación)
CALCULAR
PROCESAR
PRODUCIR SALIDA
(Módulos de salida)
FORMATEAR
ESCRIBIR

Estructura tipo del análisis de transformación · 3 ramas principales bajo el módulo coordinador

Heurística de diseño: Al aplicar el análisis de transformación se busca que el módulo de control no realice procesamiento propio (solo coordina llamadas) y que los módulos hoja sean los que realmente ejecuten la lógica de negocio.
3
Análisis de Transacción
Definición: El análisis de transacción (Transaction Analysis) se aplica cuando el DFD contiene un centro de transacción: un proceso que recibe un flujo de entrada y, en función del tipo de transacción, lo encamina hacia uno de varios flujos de procesamiento alternativos.

Flujo de transacción vs. flujo de transformación

CaracterísticaFlujo de TransformaciónFlujo de Transacción
PatrónUn flujo lineal: entrada → proceso central → salidaUn punto de despacho que distribuye a varias corrientes alternativas
Número de caminosGeneralmente uno principalVarios caminos alternativos (uno por tipo de transacción)
AnalogíaCadena de montaje (entrada, proceso, salida)Conmutador telefónico o menú de opciones
Ejemplo típicoCálculo de nóminaMenú bancario (consulta / transferencia / ingreso / retirada)

Pasos del análisis de transacción

1
Identificar el centro de transacción en el DFD

Localizar el proceso que actúa como distribuidor: recibe una entrada y la dirige hacia distintas corrientes de procesamiento según su tipo.

2
Crear el módulo coordinador de transacciones

Módulo de alto nivel que acepta la entrada y decide qué corriente de acción activar. Equivale al dispatcher o controlador.

3
Crear un módulo por cada corriente de acción

Cada tipo de transacción (cada camino en el DFD) se convierte en un módulo hijo del coordinador.

4
Desarrollar la estructura para cada corriente

Cada corriente puede contener a su vez un flujo de transformación o de transacción, que se descompone aplicando la técnica correspondiente recursivamente.

5
Refinar el diagrama

Aplicar heurísticas para mejorar cohesión, reducir acoplamiento y ajustar proporciones del árbol.

Estructura típica del análisis de transacción

MÓDULO PRINCIPAL
OBTENER Y DESPACHAR TRANSACCIÓN
(Centro de transacción)
PROCESAR
CONSULTA
PROCESAR
ALTA
PROCESAR
BAJA
PROCESAR
MODIFICACIÓN

Estructura tipo CRUD derivada por análisis de transacción · Un módulo por cada tipo de transacción

Combinación de técnicas: En la práctica, un mismo DFD puede contener partes que se modelan con análisis de transformación y partes con análisis de transacción. La técnica se aplica de forma local a cada subárbol del DFD.

Comparativa Transformación vs. Transacción

AspectoAnálisis de TransformaciónAnálisis de Transacción
Patrón de flujoLineal: entrada → centro → salidaRamificado: centro distribuye a corrientes alternativas
Estructura resultante3 ramas principales (entrada, proceso, salida)N ramas (una por tipo de transacción)
Módulo dominanteMódulo de transformación centralMódulo dispatcher/controlador
IdentificaciónSe identifica la "frontera" entre flujo físico y lógicoSe identifica el punto de despacho en el DFD
Aplicación típicaSistemas batch, procesos de cálculo, transformaciones de datosSistemas de menú, CRUD, sistemas de comandos interactivos
4
Cohesión
Definición: La cohesión es la medida del grado de relación y pertenencia de los elementos internos de un módulo entre sí. Un módulo altamente cohesionado realiza una sola función bien definida. Fue definida formalmente por Constantine y Yourdon (1979).
Regla de oro: A mayor cohesión → mejor comprensibilidad, mayor reutilización, más fácil de mantener y probar. Buscar siempre el nivel más alto posible.

Niveles de cohesión (de menor a mayor)

Se definen 7 niveles, ordenados de peor a mejor:

# Nivel Calidad Descripción Ejemplo
1 Cohesión Coincidental Muy mala Los elementos del módulo no tienen ninguna relación entre sí. Son un conjunto arbitrario de sentencias agrupadas por conveniencia Un módulo "Miscelánea" que imprime un mensaje, calcula el IVA y cierra un fichero
2 Cohesión Lógica Mala Los elementos realizan funciones de la misma categoría lógica, pero se selecciona cuál ejecutar mediante un parámetro de control. La interfaz es engañosa Módulo de "Gestión de E/S" que según un flag lee, escribe o cierra un fichero
3 Cohesión Temporal Mala Los elementos se agrupan porque se ejecutan en el mismo momento (ej.: inicialización al arrancar el sistema), no porque estén funcionalmente relacionados Módulo InicializarSistema() que abre BD, inicializa variables y carga tablas maestras
4 Cohesión Procedural Media Los elementos están relacionados porque siguen un flujo de control secuencial (uno después de otro), aunque no estén funcionalmente relacionados. Depende del orden de ejecución Módulo que verifica permisos, luego lee el fichero, luego actualiza el log
5 Cohesión Comunicacional Media-alta Los elementos operan sobre el mismo conjunto de datos de entrada o producen la misma salida. Están relacionados por los datos que manejan Módulo que calcula la media, el máximo y el mínimo del mismo vector de datos
6 Cohesión Secuencial Buena La salida de un elemento es la entrada del siguiente. Los elementos están relacionados porque forman una cadena de transformación de datos (pipeline) Módulo que lee un registro, lo valida y lo formatea: la salida de cada paso es la entrada del siguiente
7 Cohesión Funcional Óptima Todos los elementos contribuyen a realizar una única función bien definida. Es el nivel de cohesión ideal: el módulo hace una sola cosa y la hace bien (principio de responsabilidad única) calcularSeno(x), ordenarLista(lista), validarNIF(nif)

Cómo identificar el nivel de cohesión

Técnica práctica de Myers: describir la función del módulo con una sola frase y analizarla:

Si la descripción contiene…Nivel de cohesión probable
Una sola función específica (ej.: "Calcula el IVA de una factura")Funcional ✅
"Y además…" (más de una función en la descripción)Secuencial o menor ⚠️
"En el momento de…" o "al inicio / al final"Temporal ❌
"Todo tipo de…" o "varios tipos de…"Lógica ❌
No hay relación clara entre las cosas que haceCoincidental ❌
5
Acoplamiento
Definición: El acoplamiento mide el grado de interdependencia entre módulos. Un alto acoplamiento significa que los módulos están fuertemente ligados entre sí: un cambio en uno obliga a cambiar los otros. El objetivo es minimizarlo para mejorar la mantenibilidad y la independencia.
Regla de oro: A menor acoplamiento → más fácil de modificar, probar y reutilizar cada módulo de forma independiente.

Niveles de acoplamiento (de peor a mejor)

Se definen 6 niveles, ordenados de mayor a menor acoplamiento (de peor a mejor):

# Nivel Gravedad Descripción Ejemplo
1 Acoplamiento de Contenido Crítico Un módulo accede o modifica directamente el interior de otro (código, datos internos). Solo posible en ensamblador o C sin protección Módulo A modifica una variable local de módulo B sin pasar por su interfaz
2 Acoplamiento Común Muy malo Dos o más módulos hacen referencia al mismo dato global (variable global, área común de memoria). Un cambio en ese dato afecta a todos Variables globales compartidas entre módulos; áreas COMMON en COBOL/Fortran
3 Acoplamiento Externo Malo Los módulos comparten un formato de datos externo, protocolo de comunicación o dispositivo externo. Similar al común pero referido a datos externos al programa Dos módulos que leen y escriben el mismo formato de fichero externo directamente
4 Acoplamiento de Control Medio Un módulo pasa a otro un indicador de control (flag) que altera su flujo interno. El módulo llamante sabe cómo funciona el módulo llamado Llamada procesarRegistro(registro, tipoOperacion) donde tipoOperacion decide qué hace el módulo internamente
5 Acoplamiento de Marca (Stamp) Aceptable Los módulos comparten una estructura de datos compuesta (registro, objeto), pero el módulo receptor solo usa parte de ella. Se transmite más información de la necesaria Pasar un registro completo de cliente a un módulo que solo necesita el NIF
6 Acoplamiento de Datos Óptimo Los módulos se comunican únicamente mediante parámetros simples (datos elementales) que son exactamente los necesarios. Es el nivel de acoplamiento ideal calcularIVA(baseImponible, tipoIVA) → recibe solo lo que necesita, devuelve solo el resultado

Factores que determinan el nivel de acoplamiento

FactorMenor acoplamientoMayor acoplamiento
Tipo de conexiónLlamada por interfaz definida (parámetros)Acceso directo a datos internos
Tipo de datos transmitidosDatos elementales necesariosEstructuras completas, flags de control
Número de parámetrosLos mínimos necesariosMuchos parámetros, estructuras complejas
Uso de globalesSin variables globalesDatos globales compartidos
Conocimiento del interiorMódulo tratado como caja negraUn módulo conoce el funcionamiento interno del otro

El problema del acoplamiento de contenido y común

Acoplamiento de contenido

Rompe la abstracción y la ocultación de información. Imposible probar un módulo independientemente. Cualquier refactorización interna puede romper otros módulos. Prácticamente eliminado en lenguajes modernos.

Acoplamiento común (variables globales)

Dificulta el razonamiento sobre el comportamiento del programa. Introduce efectos secundarios inesperados. Hace imposible la reutilización del módulo en otro contexto. Principal fuente de bugs en sistemas grandes.

6
Comparativa, Heurísticas y Resumen

Tabla resumen: Cohesión y Acoplamiento

Métrica Objetivo Nivel peor Nivel mejor Consecuencia de un mal valor
Cohesión Maximizar Coincidental (1) Funcional (7) Módulos difíciles de entender, probar y reutilizar
Acoplamiento Minimizar De contenido (más alto) De datos (más bajo) Cambios en cascada, dificultad para mantenimiento

Heurísticas de diseño de Pressman y Yourdon

#HeurísticaDescripción práctica
H1Evaluar la primera iteraciónLa primera estructura derivada del DFD es un punto de partida, no el diseño final. Siempre se refina
H2Implosión y explosiónSi un módulo tiene fan-out muy alto (>7) → implosionar (añadir un módulo intermedio). Si un módulo tiene una sola función trivial → explotar (integrarlo en el padre)
H3Minimizar las interfacesReducir el número y complejidad de los parámetros entre módulos. Pasar solo lo necesario
H4Limitar el tamañoUn módulo no debería superar 30-50 líneas de código. Si es mayor, probablemente hace demasiadas cosas
H5Evitar el acoplamiento de controlSi un módulo pasa flags al hijo, considerar si no sería mejor dividirlo en dos módulos con nombres distintos
H6Módulos con función única y claraEl nombre del módulo debe describir completamente lo que hace. Si no es posible en pocas palabras, el módulo tiene baja cohesión
H7ReutilizaciónIdentificar funciones comunes y extraerlas como módulos de librería (fan-in alto) para maximizar la reutilización

Relación entre cohesión, acoplamiento y calidad

CombinaciónImpacto en mantenibilidadImpacto en reutilizaciónImpacto en pruebas
Alta cohesión + bajo acoplamiento ✅Excelente: cambios localizadosExcelente: módulos independientesExcelente: prueba unitaria sencilla
Alta cohesión + alto acoplamiento ⚠️Regular: cambios se propaganMala: dependencias externasDifícil: hay que montar el contexto
Baja cohesión + bajo acoplamiento ⚠️Regular: módulo confuso internamenteLimitada: función no claraDifícil: comportamiento impredecible
Baja cohesión + alto acoplamiento ❌Pésima: cambios en cascada en módulos confusosNulaMuy difícil o imposible de aislar

Resumen esquemático para oposición

Diagrama Estructurado: Representación gráfica de módulos y sus relaciones. Elementos: rectángulos (módulos), flechas sólidas (llamadas), ● datos, ○ flags, arcos (bucles), rombos (selección). Fan-out ideal: 3–7. Fan-in alto = reutilización.
Análisis de Transformación: Para DFDs con flujo lineal. Identifica flujo entrada / centro de transformación / flujo salida. El SC resultante tiene 3 ramas bajo un módulo coordinador. Pasos: revisar DFD → aislar transformación central → primera descomposición → refinar.
Análisis de Transacción: Para DFDs con punto de despacho. El SC resultante tiene un módulo dispatcher con N hijos (uno por tipo de transacción). Ambas técnicas se pueden combinar en el mismo diseño.
Cohesión (maximizar, 7 niveles): Coincidental → Lógica → Temporal → Procedural → Comunicacional → Secuencial → Funcional (óptima). Regla: un módulo = una función = un nombre.
Acoplamiento (minimizar, 6 niveles): Contenido → Común → Externo → Control → Marca (Stamp) → Datos (óptimo). Regla: pasar solo datos elementales estrictamente necesarios. Evitar globales y flags de control.

Palabras clave para respuesta de examen

ConceptoAutor/OrigenPalabras clave
Diseño estructuradoYourdon, Constantine (1979)Módulo, fan-in, fan-out, jerarquía, independencia funcional
Diagrama estructurado (SC)Constantine & YourdonRectángulo, flecha, parámetro, flag, bucle, selección
Análisis de transformaciónDeMarco, YourdonDFD, flujo de entrada, transformación central, flujo de salida
Análisis de transacciónDeMarco, YourdonCentro de transacción, dispatcher, corrientes de acción
CohesiónConstantine & Yourdon, Myers7 niveles, funcional (óptima), coincidental (peor), responsabilidad única
AcoplamientoConstantine & Yourdon6 niveles, datos (óptimo), contenido (peor), variables globales, flags