| 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() |
El programa es una secuencia de instrucciones que modifican el estado del sistema.
int suma = 0;
suma = suma + 5;
suma = suma * 2;
Extensión del imperativo que organiza el código en procedimientos o funciones reutilizables.
int calcularArea(int base, int altura) {
return base * altura;
}
Subconjunto del procedimental que elimina el uso de goto en favor de estructuras de control claras.
if/else), iteración (for/while).El programa se organiza como un conjunto de objetos que encapsulan estado (atributos) y comportamiento (métodos).
┌────────────────────────────────────────────────────┐
│ 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
}
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");
El programa es una composición de funciones puras (sin efectos secundarios).
| 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]
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; }
Diseñado para la ejecución simultánea de tareas (hilos, procesos).
Thread, synchronized), C# (async/await), C++ (std::thread).Thread t = new Thread(() -> System.out.println("Hilo paralelo"));
t.start();
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);
El flujo del programa está determinado por eventos (acciones del usuario, mensajes, señales).
document.getElementById("btn").addEventListener("click", () => {
console.log("Botón pulsado");
});
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();
}
| 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 |
| 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 |
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.
Los paradigmas son estilos o enfoques para estructurar y razonar sobre el código. No son excluyentes: un mismo lenguaje puede soportar varios (multiparadigma).
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).
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).