Paradigmas de Programación: Disciplina, No Herramientas
Los tres paradigmas imponen disciplina eliminando capacidades, no añadiéndolas.
Por qué importa
Hemos tenido tres paradigmas de programación principales desde los años 50, y no han surgido nuevos desde entonces. Cada paradigma se define no por lo que permite, sino por lo que prohíbe:
- Programación estructurada — elimina el
gotosin restricciones (disciplina sobre la transferencia directa de control) - Programación orientada a objetos — elimina los punteros a funciones (disciplina sobre la transferencia indirecta de control, reemplazada por polimorfismo)
- Programación funcional — elimina la asignación (disciplina sobre la mutación del estado)
Estas tres restricciones se corresponden directamente con las tres preocupaciones de la arquitectura: función, separación de componentes y gestión de datos. Entender los paradigmas como herramientas disciplinarias — no como conjuntos de características — cambia cómo los usas.
✗El problema
Code that uses mutable globals and unstructured loops forces the reader to simulate the machine in their head — violating every paradigm at once.
Bad
# Mutable globals, no abstraction, unstructured mutation
total = 0
discount = 0
items = [10, 20, 30]
for price in items:
total += price # mutates global
if total > 40:
discount = total * 0.1 # side effect on outer state
# What is discount? It depends on iteration order — hard to reason about
let total = 0;
let discount = 0;
const items = [10, 20, 30];
for (const price of items) {
total += price;
if (total > 40) discount = total * 0.1; // last assignment wins — confusing
}
// discount is not a computed value; it's a side-effect artifact
✓La solución
Structured flow and a pure function make the logic traceable in a single reading — no globals, no side effects, no mental simulation of state.
Good
def apply_discount(total: float, threshold: float, rate: float) -> float:
return total * (1 - rate) if total > threshold else total
def calculate_order(items: list[float]) -> float:
subtotal = sum(items)
return apply_discount(subtotal, threshold=40.0, rate=0.10)
print(calculate_order([10, 20, 30])) # 54.0 — deterministic, testable
function applyDiscount(total: number, threshold: number, rate: number): number {
return total > threshold ? total * (1 - rate) : total;
}
function calculateOrder(items: number[]): number {
const subtotal = items.reduce((s, n) => s + n, 0);
return applyDiscount(subtotal, 40, 0.10);
}
console.log(calculateOrder([10, 20, 30])); // 54 — same input, same output, always
💡Conclusión clave
Los paradigmas son restricciones, no características — cada uno elimina una forma de escribir código peligroso, y juntos forman la base disciplinaria de la arquitectura limpia.
🔧 Algunos ejercicios pueden tener errores. Si algo parece incorrecto, usa el botón Feedback (abajo a la derecha) para reportarlo — nos ayuda a corregirlo rápido.
Pista: Cada paradigma elimina una capacidad peligrosa: goto, punteros a función y asignación.
✗ Tu versión