📝 paradigmas_programacion
← Volver

Paradigmas de Programación

Tabla Resumen

Paradigma Pregunta central Concepto clave Ejemplo típico
Imperativo ¿Cómo hacerlo? Secuencia de instrucciones x = x + 1
Procedimental ¿Cómo estructurarlo? Funciones/procedimientos void calcular()
Estructurado ¿Cómo controlarlo? Sin goto, uso de bloques if/while/for
OOP ¿Quién lo hace? Objetos con estado y comportamiento objeto.metodo()
Funcional ¿Qué transformar? Funciones puras, sin efectos secundarios map(f, lista)
Genérico ¿Con qué tipo? Código parametrizado por tipos List<T>
Concurrente ¿Simultáneamente? Hilos, sincronización Thread, async
Reflexivo ¿Qué soy en tiempo de ejecución? Introspección y modificación dinámica getClass()
Dirigido por eventos ¿Cuándo ocurre? Listeners/callbacks ante eventos onClick(handler)
Basado en prototipos ¿De quién heredo? Herencia mediante objetos, no clases Object.create()

1. Paradigma Imperativo

El programa es una secuencia de instrucciones que modifican el estado del sistema.

int suma = 0;
suma = suma + 5;
suma = suma * 2;

2. Paradigma Procedimental

Extensión del imperativo que organiza el código en procedimientos o funciones reutilizables.

int calcularArea(int base, int altura) {
    return base * altura;
}

3. Paradigma Estructurado

Subconjunto del procedimental que elimina el uso de goto en favor de estructuras de control claras.


4. Paradigma Orientado a Objetos (OOP)

El programa se organiza como un conjunto de objetos que encapsulan estado (atributos) y comportamiento (métodos).

Cuatro pilares:

┌────────────────────────────────────────────────────┐
│  ENCAPSULACIÓN   │ Ocultar estado interno           │
│  HERENCIA        │ Reutilizar comportamiento         │
│  POLIMORFISMO    │ Un método, múltiples formas       │
│  ABSTRACCIÓN     │ Modelar entidades del mundo real  │
└────────────────────────────────────────────────────┘
class Animal {
    String nombre;
    void hablar() { System.out.println("..."); }
}
class Perro extends Animal {
    void hablar() { System.out.println("Guau"); }  // Polimorfismo
}

OOP por Prototipos (JavaScript)

En lugar de clases, los objetos heredan directamente de otros objetos (prototipo).

const animal = { hablar() { console.log("..."); } };
const perro = Object.create(animal);
perro.hablar = () => console.log("Guau");

5. Paradigma Funcional

El programa es una composición de funciones puras (sin efectos secundarios).

Conceptos clave:

Concepto Descripción
Función pura Misma entrada → misma salida, sin estado externo
Inmutabilidad Los datos no se modifican, se transforman
Funciones de orden superior Funciones que reciben/retornan otras funciones
Ciudadanos de primera clase Las funciones son valores (se asignan, pasan como parámetros)
Composición f(g(x)) encadena transformaciones
# Función pura + ciudadanos de primera clase
cuadrado = lambda x: x ** 2
resultado = list(map(cuadrado, [1, 2, 3]))  # [1, 4, 9]

6. Paradigma Genérico

Permite escribir código parametrizado por tipos, reutilizable para distintos tipos de datos sin duplicación.

// Java Generics
List<String> nombres = new ArrayList<>();
List<Integer> numeros = new ArrayList<>();
// C++ Templates
template<typename T>
T maximo(T a, T b) { return a > b ? a : b; }

7. Paradigma Concurrente

Diseñado para la ejecución simultánea de tareas (hilos, procesos).

Thread t = new Thread(() -> System.out.println("Hilo paralelo"));
t.start();

8. Paradigma Reflexivo

Capacidad del programa de inspeccionar y modificar su propia estructura en tiempo de ejecución.

# Python - reflexión
clase = type(objeto)          # Obtener tipo
metodos = dir(objeto)         # Listar métodos
getattr(objeto, "nombre")     # Acceder a atributo dinámicamente
// Java - Reflection API
Class<?> c = obj.getClass();
Method m = c.getMethod("miMetodo");
m.invoke(obj);

9. Paradigma Dirigido por Eventos

El flujo del programa está determinado por eventos (acciones del usuario, mensajes, señales).

document.getElementById("btn").addEventListener("click", () => {
    console.log("Botón pulsado");
});

10. Paradigma Asíncrono

Permite que tareas largas se ejecuten sin bloquear el hilo principal, usando callbacks, promesas o async/await.

async function cargarDatos() {
    const datos = await fetch("https://api.ejemplo.com/datos");
    return datos.json();
}

Lenguajes y sus Paradigmas

Lenguaje Paradigmas principales
Java Imperativo, orientado a objetos, funcional, concurrente
JavaScript Imperativo, orientado a objetos por prototipos, funcional, dirigido por eventos, asíncrono, funciones de primer orden (ciudadanos de primera clase)
C Imperativo, procedimental, estructurado
C++ Imperativo, procedimental, orientado a objetos, genérico, funcional, concurrente
C# Imperativo, orientado a objetos, funcional, genérico, concurrente, reflexivo
PHP Imperativo, orientado a objetos, funcional, reflexivo
Python Imperativo, procedimental, orientado a objetos, funcional, reflexivo

Comparativa: OOP vs Funcional

Criterio OOP Funcional
Unidad básica Objeto Función
Estado Mutable (encapsulado) Inmutable
Efectos secundarios Permitidos Evitados (funciones puras)
Reutilización Herencia / composición de objetos Composición de funciones
Idoneidad Modelado de entidades del mundo real Transformación y procesamiento de datos
Ejemplos de lenguajes puros Smalltalk Haskell, Erlang

Árbol de Relaciones entre Paradigmas

DECLARATIVO ─────────────────────────────────────────────┐
                                                          │
IMPERATIVO                                                │
    ├── Procedimental                                     │
    │       └── Estructurado                              │
    ├── Orientado a Objetos                               │
    │       ├── OOP por Clases (Java, C++, C#, Python)    │
    │       └── OOP por Prototipos (JavaScript)           │
    ├── Funcional ──────────────────────────────────────► (también declarativo)
    ├── Genérico
    ├── Concurrente
    ├── Reflexivo
    ├── Dirigido por Eventos
    └── Asíncrono

⚠️ La mayoría de los lenguajes modernos son multiparadigma: permiten combinar estilos según la necesidad del problema.


Resumen en 3 puntos

  1. Los paradigmas son estilos o enfoques para estructurar y razonar sobre el código. No son excluyentes: un mismo lenguaje puede soportar varios (multiparadigma).

  2. Los tres paradigmas más importantes en oposiciones son: Imperativo (base de casi todo), OOP (objetos con encapsulación, herencia, polimorfismo y abstracción) y Funcional (funciones puras, inmutabilidad, ciudadanos de primera clase).

  3. JavaScript es el lenguaje más "especial" de la tabla: usa herencia por prototipos (no por clases al estilo Java/C#), tiene funciones de primera clase como ciudadanos nativos, y su modelo asíncrono y dirigido por eventos es parte central del lenguaje (event loop).