Imperativo¶
Es un paradigma de programación enfocado a las variables, procedimientos y secuencialidad
#Variables
width = 10
height = 10
#Procedimientos
def crearMatrix(w, h):
#Estructuras de control
# Condicional flujos
if w >= 0 and h >= 0:
#Estructura de control repetición
for i in range(0,w):
for j in range(0,h):
#Instrucciones
Paradigma O.O¶
Se utiliza el objeto como abstracción del mundo real, un objeto tiene propiedades y comportamiento
Un objeto se instancia desde una clase, la cual una plantilla la cual nos ofrece la estructura que tiene un objeto: campos y los métodos
Instanciar es darle valores a los campos
class Pepito {
//Atributos
int atributoA;
int atributoB;
//Métodos
//Constructor
Pepito() {
atributoA = 1;
atributoB = 2;
}
int sumarC(int x) {
//Instrucciones
return x + atributoA;
}
int metodoD(int a, int b, int c = 8)
//Valores por defecto
int metodoD(...) {
if(...){
}
else {
}
for(int i=0; i<=n; i++){}
switch(x){
case 1:
break;
default:
break;
}
while(cnt <= n) {
}
int a = 0; //32 bits
short b = 0; //16 bits
byte c = 0; //8 bits
boolean d = true; //True o False
char e = 'c'; //8 bits
long d = 2L; //64 bits
float f = 4f; //32 bits
double x = 3.0; //64 bits
unsigned int y = 0; //32 bits no **signado**
}
}
Programación orientada a eventos¶
El flujo del programa se basa en las interaciones con el usuario. - Clic del ratón - Mover el ratón. - Presionar una tecla - Etc Estos originan eventos los cuales son capturados y en consecuencia se ejecutan las instrucciones.
Colecciones¶
Agrupaciones de datos
- Listas enlazadas (LinkedList)
- Arreglos dinámicos (ArrayList)
- Tablas Hash (HashMap, TreeMap)
- Vectores (Vector) en memoria el vector almacena el doble de los elementos para optimizar la inserción
- Queue / Stacks
Programación funcional¶
Está orientada a las funciones y cómo estas interactuan entre sí, desde la matemática tenemos el concepto función: Dominio (valores de entrada), Rango (valores de salida)
En computación llevamos esto a un nivel más generico
- Las entradas pueden ser distintos tipos
- Salidas tambien ser de distintos tipos
- Las funciones se consideran ciudadanos de primera clase, se trabaja igual que los valores. Una función se puede invocar
En programación funcional tenemos varios hitos
- El programa se basa en las funciones y no en la secuencialidad. No importa donde este ubicada una función se puede llamar.
- Hay ligaduras y no variables. Una ligadura es nombrar un valor, estos no pueden cambiar, es decir no hay asignación
- Tampoco hay secuencialidad como consecuencia del punto 1.
- Se utiliza principalmente la recursión
- Caso base: Solución inmediata
- Caso recursivo nos debe llevar al caso base
- Tenemos estrategias de manejo funcional
- Funciones de alto orden: filter, map, reduce
- reconocimiento de patrones
- Expresiones for
- No se tienen retornos, todo se considera como un valor
class Perrito {
def funcion(n:Int):Int = {
val n2 = Math.pow(n,2).toInt
val n3 = Math.pow(n,0.5).toInt
n2 + n3
}
}
Apunte¶
La asignación no es funcional. ¿Por qué?
Porque no retorna un valor. En programación funcional, las funciones deben ser expresiones que produzcan un resultado, no instrucciones que solo ejecutan efectos secundarios.
Los tipos void o null no se consideran funcionales en este contexto porque:
- No representan un valor útil para transformaciones o composiciones.
- Rompen el principio de transparencia referencial, ya que no pueden ser sustituidos por su resultado sin alterar el comportamiento del programa.
En esencia, una función pura siempre debe mapear entradas a salidas, y la asignación (como modificar variables externas) viola este principio al carecer de un valor de retorno significativo.
public class Perrito {
int pesito = 3;
void metodito() {
// ❌ ASIGNACIÓN NO FUNCIONAL:
// 1. La expresión `pesito += 3` realiza una asignación (modifica el estado de `pesito`).
// 2. En programación funcional, las asignaciones mutables están prohibidas porque:
// - Rompen la transparencia referencial (el resultado depende del estado externo).
// - Generan efectos secundarios (cambian valores fuera de su ámbito local).
// 3. Además, este código intenta asignar el resultado de la asignación (que es de tipo `int`)
// a la variable `cosita`, pero en un contexto de método `void`, lo cual es inconsistente.
// ❌ ERROR EN JAVA:
// Java no permite asignar un valor a una variable local si el método es `void`.
// El operador `+=` devuelve el nuevo valor (en este caso, 6), pero el método
// no está diseñado para retornar nada. Esto genera un error de compilación porque:
// "Unexpected return value from assignment in void method".
int cosita = pesito += 3; // 🚫 Error de compilación: incompatible types
}
}
Explicación ampliada:¶
- No es funcional: Porque modifica el estado de
pesito(efecto secundario) y intenta usar el resultado de una asignación como expresión de valor. - Falla en Java: Un método
voidno puede capturar el resultado de una expresión de asignación (comopesito += 3) en una variable, ya que eso implica un retorno de valor no permitido en este contexto.