En este post vamos a hablar hacerca de algunos de los paradigmas de programación y los lenguajes de acuerdo a cada uno.
Los paradigmas de programación son maneras diferentes de resolver problemas, estos definen reglas, técnicas, teorias y fundamentos que permiten optimizar el desarrollo de software.
Estos se clasifican en dos grandes grupos:
- Los paradigmas de programación Imperativa
- Los paradigmas de programación Declarativa
Paradigma Imperativo
Es uno de los paradigmas más viejos y se enfoca en cómo realizar una tarea, es decir en el proceso, por ende el código debe ser explícito. A continuación un ejemplo:
# Promedio de los 6 primeros números
numbers = [1, 2, 3, 4, 5, 6]
average = 0.0
numbers.each do |number|
average = average + number
end
average = average / 6
# OUT => 3.5
Dentro de este grupo (imperativo) encontramos los siguientes paradigmas:
- Procedimental
- Orientado a Objetos
- Programación paralela
Programación Procedimental
También conocido como estructurado, este paradigma se enfoca en definir la lógica paso a paso y es básicamente como la mayoria de personas aprendemos a programar.
let numero = prompt("Ingresa un número"),
factorial = 1;
for(let i = 1; i <= numero; i++){
factorial = factorial * i;
}
console.log(`El factorial de ${ numero } es ${ factorial }`);
Como podemos ver, calculamos el factorial dentro de un ciclo. Algunos de los lenguajes que soportan este paradigma son:
- C
- Java
- C++
Programación Orientada a Objetos (OOP)
Este paradigma nos permite programar pensando analógicamente como es el mundo real, aquí tenemos clases y objetos que nos permiten encapsular lógica, ordenar el código de acuerdo a entidades y manipular datos.
Veamos un ejemplo sencillo para entenderlo mejor:
# Creamos la clase
class Vehicle
# Definimos las propiedades que van a tener los objetos
attr_accessor :color, :type, :brand
# Definimos los métodos que van a tener los objetos
def details
puts @color ||= "undefined"
puts @type ||= "undefined"
puts @brand ||= "undefined"
end
end
# Creamos una instancia de la clase, es decir un objeto
carro = Vehicle.new
# Modificamos las propiedades del objeto
carro.color = "Azul"
carro.type = "Moto"
carro.brand = "Kawasaki"
# Usamos el método del objeto
carro.details
=begin
OUT:
Azul
Moto
Kawasaki
=end
Tenemos una clase Vehicle, las clases nos permiten definir el molde que van a tener los objetos una vez creados. Dentro de la clase tenemos propiedades o atributos, estos definen las características que en este caso es el color, brand y type, luego tenemos métodos, que no son más que ‘acciones’ que se pueden hacer con dicho objeto. Solo tenemos un método que nos muestra los detalles del vehículo pero puede tener más como por ejemplo encender, apagar, etc…
Finalmente creamos una instancia de una clase, a esto se le llama cuando creamos un objeto, llamada carro. Luego definimos el valor de las propiedades de nuestro objeto y por último llamamos la función que nos mustra los detalles de nuestro objeto.
yyyyyyyyyyyyyyyy…!!!
Así es como funciona el paradigma Orientado a Objetos y como podemos darnos cuenta es muy fácil ya que se asemeja a como se persiben las cosas en la vida real. Algunos de los lenguajes que soportan este paradigma son:
- Java
- C++
- Python
- Ruby
- JavaScript - TypeScript
- Rust
- Go
Programación Paralela
Este se enfoca en dividir la lógica de un programa atravez de multiples procesadores y de esta manera resolver la tarea en el menor tiempo posible.
import concurrent.futures
def calcular_cuadrado(numero):
return numero ** 2
numeros = [1, 2, 3, 4, 5]
# Ejecutar en paralelo
with concurrent.futures.ThreadPoolExecutor() as executor:
resultados = list(executor.map(calcular_cuadrado, numeros))
print(f"Resultados: {resultados}")
# Resultados: [1, 4, 9, 16, 25]
Explicación:
- Función: calcular_cuadrado toma un número y devuelve su cuadrado.
- Lista de números: Se define la lista [1, 2, 3, 4, 5].
- Paralelismo: Usamos ThreadPoolExecutor para ejecutar calcular_cuadrado en paralelo para cada número.
- Resultados: Los resultados se recolectan en una lista.
Paradigma Declarativo
Este orienta la programación enfocados en el resultado final, es decir el qué, sin tener que enfocarse en el paso a paso. A continuación se hace el mismo ejemplo del paradigma imperativo pero usando el declarativo.
average = 0.0
(1..6).each { |number| average += number }
average /= 6
# OUT => 3.5
Podemos notar que se llega al mismo resultado pero con menos lineas de código. Dentro de este grupo podemos encontrar paradigmas como:
- Funcional
- Reactivo
- Basada en bases de datos
- Lógica
Programación Funcional
Se enfoca en encapsular un número finito de instrucciones dentro de un bloque de código, como las funciones y de esa manera llamarla dentro del programa principal, de esta forma se reutiliza código. A continuación un ejemplo.
# Función para imprimir el número anterior y posterior
# de un número en concreto
def pre_pos_number(number)
pre = number - 1
pos = number + 1
puts "Número base #{number}"
puts "Anterior #{pre}"
puts "Posterior #{pos}"
end
pre_pos_number(6)
=begin
OUT:
Número base 6
Anterior 5
Posterior 7
=end
Podemos calcular el número anterior y posterior de un número cuantas veces se quiera reutilizando el código encapsulado en la función. Solo necesitamos llamar la función y pasarle el número base.
Algunos de los lenguajes de programación que soportan este paradigma son:
- C
- C++
- Java
- JavaScript
- Pascal
- Python
- Kotlin
- Visual Basic .NET
En ruby todo es un objeto y aunque se defina una función, netamente se está haciendo una llamada a un método de la clase Object. Sin embargo se puede realizar programación funcional.
Programación Reactiva
Se enfoca en trabajar con flujos de datos finitos o infinitos de manera asíncrona y reaccionar a ellos a partir de eventos. Cómo se trabajan con procesos asíncronos no tenemos conocimiento de cúando va a ocurrir un cambio de información por ende es que necesitamos observar y reaccionar a los eventos para poder realizar una acción en concreto.
Un ejemplo claro de esto es tomando como referencia la API Intersection Observer de JavaScript, la cual nos permite observar un área determinada de la pantalla y reaccionar cuando se oculta o se muestra al usuario.
Programación basa en bases de datos
Permiten enfocar el desarrollo a la manipulación de datos dentro de una base de datos. Este es el más claro ejemplo de programación declarativa, veamos un ejemplo:
SELECT * FROM songs WHERE genre="Dubstep"
En el ejemplo deseamos traer información, aqui respondemos a un ¿Qué?, ¿qué queremos hacer?. En este caso traer todas las canciones que pertenecen al genero musical ‘electronica’.
Aqui nosotros no sabemos como internamente el lenguaje hace el proceso para traernos la respuesta, a nosotros solo nos interesa el qué pedirle y no más!, esta es la escencia de la programación declarativa.
Programación lógica
En este paradigma nosotros tenemos como base preposiciones y relaciones lógicas y de acuerdo a estas se hacen preguntas y el programa retorna una respuesta. A continuación un ejemplo:
% Definición de relaciones
padre(juan, maria).
padre(maria, carlos).
padre(carlos, ana).
% Regla para determinar si alguien es ancestro
ancestro(X, Y) :- padre(X, Y).
ancestro(X, Y) :- padre(X, Z), ancestro(Z, Y).
% Consulta
% ¿Es juan ancestro de ana?
Este paradigma tiene que ver mucho con la lógica matemática.
Por último, saber cuándo usar un paradigma u otro es importante ya hace parte de la calidad de software y de la facilidad de escalar y mantener el sistema. Por tal razón es necesario conocer los paradigmas que existen en el desarrollo de software para poder tener bases y tomar decisiones adecuadas en cuanto cual usar respecto al proyecto.