Programacion Imperativa vs Declarativa

¿Qué es la programacion Imperativa? . Todos estamos habituados a programar y cuando lo hacemos habitualmente usamos un enfoque imperativo. ¿Qué quiere decir esto? , pues simplemente que le decimos al lenguaje de programación como tiene que realizar cada uno de los pasos .Le decimos que variables usar, que bucles y sentencias  etc. Es decir construimos un algoritmo muy concreto para solventar un problema. Vamos a ver un ejemplo con una lista de Personas:

package com.arquitecturajava;

public class Persona {

	private String nombre;
	private int edad;
	public String getNombre() {
		return nombre;
	}
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	public int getEdad() {
		return edad;
	}
	public void setEdad(int edad) {
		this.edad = edad;
	}
	public Persona(String nombre, int edad) {
		super();
		this.nombre = nombre;
		this.edad = edad;
	}
}

Programacion Imperativa

Vamos a crear un programa que nos imprima la media de edad de las personas mayores de 18 años . Para ello vamos a usar un enfoque de programacion imperativa.


package com.arquitecturajava;

import java.util.ArrayList;
import java.util.List;

public class Principal {

	public static void main(String[] args) {
	
		Persona p1= new Persona("pepe",20);
		Persona p2= new Persona("juan",12);
		Persona p3= new Persona("angela",30);
		Persona p4= new Persona("gema",40);
		Persona p5= new Persona("david",15);
		
		
		List<Persona> lista=new ArrayList<Persona>();
		
		lista.add(p1);
		lista.add(p2);
		lista.add(p3);
		lista.add(p4);
		lista.add(p5);
		
		
		int totalEdad=0;
		int totalPersonas=0;
		
		for (Persona p: lista) {
			
			if (p.getEdad()>=18) {
				
				totalEdad+=p.getEdad();
				totalPersonas++;
			}
			
		}
		System.out.println(totalEdad/totalPersonas);
 	}

}

En este caso hemos declarado dos variables que hacen de acumuladores y utilizado un bucle for y una sentencia if. El programa imprime un resultado.

programacion imperativa

Sin embargo hoy en día esta opción ya no es la mejor opción . Vamos a realizar la misma operativa con programación declarativa. 


package com.arquitecturajava;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.OptionalDouble;

public class Principal2 {

	public static void main(String[] args) {
	
		Persona p1= new Persona("pepe",20);
		Persona p2= new Persona("juan",12);
		Persona p3= new Persona("angela",30);
		Persona p4= new Persona("gema",40);
		Persona p5= new Persona("david",15);
		
		
		List<Persona> lista=new ArrayList<Persona>();
		
		lista.add(p1);
		lista.add(p2);
		lista.add(p3);
		lista.add(p4);
		lista.add(p5);
		
		OptionalDouble resultado=lista.stream().filter(persona->persona.getEdad()>=18)
					  .mapToInt(persona->persona.getEdad())
					  .average();
					 
					  
		
		if(resultado.isPresent()) {
			
			System.out.println(resultado.getAsDouble());
		}

}
}

En este caso hemos solicitado al programa que  realice una serie de tareas  apoyándonos en programación funcional “el enfoque ha sido declarativo”.

programacion imperativa declarativa

Hemos declarado de forma abstracta las tareas a realizar y el lenguaje se ha encargado de los detalles. En este caso hemos utilizado expresiones Lambda. El resultado es idéntico.

programacion imperativa

La programación declarativa nos permite crear programas más compactos , reutilizables y thread safe , poco a poco nos iremos acostumbrando a ella en el mundo Java.

Otros artículos relacionados :  Java Lambda , Java Streams , Java WorkFlows

It's only fair to share...Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedIn

About Cecilio Álvarez Caules

Cecilio Álvarez Caules Sun Certified Enterprise Architech (J2EE/JEE).

12 Responses to Programacion Imperativa vs Declarativa

  1. Anthony Piñero 20 Septiembre, 2016 at 15:51 #

    Me parece muy bueno el articulo, si el futuro es la programacion declarativa a donde nos lleva este paradigma de programacion? y como sera la manera de pensar de los que cambien a el mismo?

    • Cecilio Álvarez Caules 20 Septiembre, 2016 at 18:10 #

      pues tendremos que irlo viendo 🙂

  2. Nestor 20 Septiembre, 2016 at 23:19 #

    Casualmente estoy estudiando esto para obtener el OCP y una ayudita extra siempre es de agradecer, gracias por el artículo.

    • Cecilio Álvarez Caules 21 Septiembre, 2016 at 6:16 #

      De nada 🙂

  3. paquete 22 Septiembre, 2016 at 10:46 #

    Si, hay que ir acostumbrándose a java8 y las nuevas cosas que trae. Yo personalmente soy un paquete aún con estos temas. Hace poco que empecé a leerte y ya vuelvo cada poco a ver qué vas publicando. Buen artículo.

    • Cecilio Álvarez Caules 22 Septiembre, 2016 at 13:11 #

      gracias 🙂

  4. neo 26 Septiembre, 2016 at 0:28 #

    un dolor de cabeza con las expresiones Lambda

    • Cecilio Álvarez Caules 26 Septiembre, 2016 at 9:17 #

      La verdad es que cuesta adaptarse 🙂

  5. Machl 28 Septiembre, 2016 at 22:57 #

    No todo es color de Rosa, la programacion declarativa ha sido fuertemente impulsada por Python, Matlab entre otros lenguajes.
    El problema radica cuando quieres algo mas especifico (no comun). Ahi nuevamente tienes que programar imperativamente.
    Saludos.

    • Cecilio Álvarez Caules 29 Septiembre, 2016 at 6:14 #

      gracias por el aporte 🙂

  6. Carlos Porras 12 Octubre, 2016 at 18:23 #

    Muy buen articulo

    • Cecilio Álvarez Caules 13 Octubre, 2016 at 9:46 #

      gracias 🙂

Deja un comentario