Arquitectura de Software

Modularidad, Funciones y Alcance

Diseño modular y gestión del Call Stack en C, JavaScript, Python y Java.

SLIDE 1 / 6

1. Principios de la Modularidad

La modularidad consiste en dividir un sistema complejo en partes independientes (módulos o subprogramas) con responsabilidades únicas.

Reusabilidad: Escribir una solución una vez e invocarla múltiples veces.
Abstracción: Ocultar los detalles de implementación detrás de una interfaz clara.
ARQUITECTURA DE MÓDULOS
[Main Application]
├── [Math Module] ├── [Auth Module] └── [UI Renderer]

2. Funciones vs Procedimientos

  • Función Pura: Procesa argumentos y retorna un valor calculado sin efectos secundarios.
  • Procedimiento (Void): Ejecuta acciones (E/S, mutaciones) y retorna void (o None/undefined).
modularity.c
// Función (Retorna int)
int sumar(int a, int b) {
    return a + b;
}

// Procedimiento (Efecto secundario)
void imprimir_reporte() {
    printf("Proceso completado\n");
}

3. Reglas de Alcance (Scope)

El alcance define la visibilidad y vida útil de una variable dentro del programa.

C / Java: Alcance de bloque {...} y ámbito global/clase.
JavaScript: Scope de bloque (let/const), función (var) y Lexical Closures.
Python: Regla LEGB (Local, Enclosing, Global, Built-in).
scope.js
let globalVar = "Global";

function testScope() {
    let localVar = "Local";
    if (true) {
        let blockVar = "Block";
    }
    // blockVar no es accesible aquí
}

4. Firmas y Funciones de Primera Clase

  • Java: Sobrecarga estricta (mismo nombre, distintos parámetros).
  • C: Prototipos únicos. No permite sobrecarga nativa.
  • JS / Python: Funciones como ciudadanos de primera clase (se pasan como argumentos).
Overloading.java
public class MathUtils {
    public static int add(int a, int b) { return a + b; }
    public static double add(double a, double b) { return a + b; }
}

5. El Call Stack y Recursión

Cada llamada a función crea un marco (Stack Frame) con sus parámetros y variables locales. Al retornar, el marco se destruye (LIFO).

Recursión: Función que se llama a sí misma. Requiere caso base para evitar StackOverflow.
recursion.py
def factorial(n):
    if n <= 1:
        return 1 # Caso base
    return n * factorial(n - 1)

print(factorial(3)) # 3 * 2 * 1 = 6

6. Simulador Interactivo de Call Stack

Simulá la pila de llamadas durante la ejecución:

C Execution Trace
Paso 1: main() es empujado al Call Stack.
[CALL STACK: main()]