# data[].attributes.body
Imperativa:
-Se definen los procesos para llegar al     resultado
-Modular, estructurada y procimental
Declarativa:
-Se define directamente el resultado
-Lógica, funcional y referencialmente transparente

# data[].attributes.body
La programación imperativa consiste en una serie de instrucciones que contienen las operaciones que debe realizar el ordenador.
Por otra parte, la programación declarativa se centra en describir lo que se desea que la computadora calcule u obtenga, sin indicar las instrucciones necesarias para ello.

# data[].attributes.body
La programación imperativa describe qué pasos hay que dar (How?) para obtener la solución de un problema, mientras que la programación declarativa describe qué/cuál es (What?) la solución del problema

# data[].attributes.body
En la prog. imperativa se declara cómo operar para llegar a un resultado mientras que en la interactiva se especifica qué se quiere obtener.

# data[].attributes.body
Declarativa -> programas que necesitan declarar las condiciones -> describe lo que quiere solucionar pero no las instrucciones necesarias para ello.

Imperativa-> como se realiza la tarea -> se detallan las instrucciones para llegar a la solución.

# data[].attributes.headline
El lenguaje imperativo se basa en instrucciones, muchas veces similares al lenguaje humano. El lenguaje declarativo se basa en la declaración de funciones matemáticas con el fin de procesar datos de ese ámbito. Ambos procesan datos, pero su código se escribe de diferente manera. Los imperativos son más "populares" entre la gran mayoría de programadores, o al menos tienen más visibilidad.

# data[].attributes.subject
El lenguaje imperativo se basa en instrucciones, muchas veces similares al lenguaje humano. El lenguaje declarativo se basa en la declaración de funciones matemáticas con el fin de procesar datos de ese ámbito. Ambos procesan datos, pero su código se escribe de diferente manera. Los imperativos son más "populares" entre la gran mayoría de programadores, o al menos tienen más visibilidad.

# data[].attributes.body
Programación imperativa.
- Se centra en el "como"
- Describe las instrucciones y la secuencia que deben llevar paso paso para dar lugar a un resultado.
- Mayor volumen de código
- Poco reusable

Programación declarativa.
- Se centra en el "que"
- Describe el resultado final.
- Menor volumen de código (funciones preestablecidas)
- Reusable.

# data[].attributes.body
La programación Imperativa:
Es un paradigma de programación, esta enfocada en cómo se ejecuta el código, define el control de flujo de manera explícita y cambia el estado de una máquina. El control de flujo se refiere a la declaración de variables, decisiones, loops, manejo de excepciones etc.
La programación Declarativa:
Define la lógica de lo que se va a ejecutar, pero sin indicar como ni un detalle del control de flujo.

# data[].attributes.attachment_link.readable_text
August 15, 2019

Una de las cosas que me llamó la atención es que la cantidad de posts que te llevan a definiciones vagas u opiniones que se encuentran totalmente alejadas de la realidad abundad en internet sobre este tema, todos muestran el mismo ejemplo de la instrucción for y dicen exactamente lo mismo: Programación declarativa es cuando declaras lo que quieres hacer y no le dices como hacerlo. El problema de esta definición es que te lleva a la interpretación, y con la interpretación llega la opinión, y es en ese preciso momento donde el sentido que tiene el desarrollo, de ser una ciencia exacta, se pierde. No quiero ser mal interpretado con esto, las opiniones son validas y tu puedes preferir un estilo sobre el otro, lo que sencillamente no tolero es inventar definiciones. Me he llevado sorpresas del tipo: Un if es lo más declarativo que existe, ya que declaras que quieres que el código vaya por un lado o por el otro. Lo anterior es, académicamente, incorrecto. Programación declarativa y programación imperativa tienen una definición muy establecida y fácil de entender que no debería dar espacio para interpretaciones. Y en esta web vamos a ver esto.

Partamos por la más sencilla, la que te enseñan en todos los tutoriales de internet y también en las universidades:

Que es la programación imperativa?

Es un paradigma de programación, esta enfocada en cómo se ejecuta el código, define el control de flujo de manera explícita y cambia el estado de una máquina.

Ahora vamos parte por parte, la oración de esta enfocada en cómo se ejecuta el código esta abierta a la interpretación y le puedes dar la definición que quieras en base a que sea para ti como se ejecuta el código. Y por el solo hecho de ser ambigua la detesto. Sin embargo todo lo que viene después no es ambiguo ya que esta hablando sobre conjunto de operaciones que se realizan en los lenguajes de programación. Cuando se dice que define el control de flujo tenemos algo bastante detallado a que se refiere. Si buscamos en internet, lo cual no es necesario ya que te lo diré acá, podemos ver de que control de flujo se refiere a algo muy específico:

Definición de variables

Todo let, const o var es imperativo, cada vez que defines una constante estas definiendo control de flujo y, además, estás mutando el estado de la máquina, este puede ser después recolectado por el garbage collector, sin embargo sigue siendo una mutación que se encuentra en la memoria de la máquina y además define una variable que será utilizada más adelante para definir el flujo.

Decisiones

Todo if, else, else if, switch o instrucción que te permita a ti tomar una decisión en base a algo que ya definiste es considerado imperativo.

Loops

Así es, este aparece en todos los ejemplos de internet, todo loop controlado, ya sea for, while, do while, entre otros, donde donde en base a una condición debamos detener este loop, es considerado imperativo, incluso los foreach donde de manera explicita estemos indicando que vamos a iterar un arreglo, no así map, filter y reduce ya que son conceptos matemáticos de aplicar función, filtrar y finalmente fold, sobre esto hablaremos más adelante cuando veamos Monads. En definitiva cualquier loop controlado, infinito, con condición de salida, sin condición de salida, break o continue son considerados imperativos.

Manejo de excepciones con try catch

Cuando definimos de manera explicita un try catch, estamos definiendo de manera imperativa por que lado de nuestro código vaya la ejecución de este.

Async

Así es, nuestra querida función de Async await también es considerada imperativa.

Generadores

Funciones generadores también son consideradas parte del control de flujo y, por ende, imperativa.

Luego de haber visto esto lo más probable es que me estes odiando o estes de acuerdo conmigo, sin embargo déjame decirte de que todo lo escrito anteriormente no refleja mi opinión si no la misma definición que puedes encontrar en papers históricos que hablan sobre los primeros computadores y lenguajes de programación. Estamos hablando de que lo más probable es que hayas estado escribiendo código imperativo creyendo que este es código declarativo. Ahora que ya sabemos que es control de flujo nos queda ver la parte de "Cambia el estado de la máquina", sin embargo esto ya es más sencillo de ver.

Cambia el estado de la máquina

Con esto nos referimos a la declaración de variables, estas vas a modificar el estado de la máquina, y es aún peor si definimos variables globales ya que estas mutan el estado de la maquina y esta mutación puede perdurar durante bastante tiempo, años inclusive.

Programación declarativa

Ya definido el control de flujo y la programación imperativa ya podemos pasar a ver la definición de la programación declarativa:

Define la lógica de lo que se va a ejecutar, pero sin indicar como ni un detalle del control de flujo.

Esta definición, luego de que ya sabemos lo que es control de flujo, es muy poderosa, ya que te permite darte cuenta de que si has escrito un if, pensando que es declarativo, no estabas en lo correcto, la programación declarativa se ve muy parecida a un "tubo", donde se recibe una entrada y esta escupe una salida, y puedes puedes hacer código declarativo de multiples maneras, ya sea escribiendo solo middlewares, composición de funciones como vimos un capítulo anterior, con clases, etc. Nosotros no utilizaremos las clases pero si haremos código más declarativo utilizando composición o middlewares.

Un ejemplo de programación declarativa:

En el ejemplo de arriba vemos cual es la intención del código escrito:

1. Tomamos el objeto de request y se lo entregamos a nuestra función handleCreateUser.

2. La función valida la petición contra un esquema

3. Luego guardamos en la base de datos con el modelo del usuario.

4. Finalmente enviamos los datos al cliente o enviamos el error en el caso de que exista.

Si se fijan, el detalle de cómo esta implementado esto no lo vemos, tampoco nos interesa, lo que nos interesa es la intención del código. Sabiendo la intención del código podremos ver si existe algún error en nuestra lógica y, lo que finalmente nos interesa que se encuentre con tests, son estas pequeñas funciones que hemos creado donde nuestro detalle queda abstraído de nosotros. No hay if, try catch, for, async await, solo composición de funciones. Esto podría ser generalizado aún más y así poder reutilizar más nuestro código, incrementando nuestra velocidad y calidad en el largo plazo.

Así que la próxima vez que quieran escribir una funcionalidad, donde quieran plasmar la lógica de lo que se esta escribiendo, primero denle nombre a las funciones, definan paso a paso que es lo que quieren que haga su código, las dependencias que este puede necesitar utilizando currying, aplicación parcial o closures y, cuando el orden y lo que se tenga que ejecutar les haga sentido, luego implementen el detalle, o incluso mejor, los tests y luego el detalle.

# data[].attributes.attachment_link.description
Hoy veremos una clara definición de que es programación declarativa y que es programación imperativa.

# data[].attributes.body
En la programación imperativa se indica una secuencia de operaciones a realizar.
En la programación declarativa se especifica el resultado deseado, no cómo lograrlo.

# data[].attributes.body
https://es.sawakinome.com/articles/programming/difference-between-declarative-and-imperative-programming.html

# data[].attributes.body
En programación imperativa se describe de manera explícita los pasos y la secuencia para obtener la solución deseada. Su aplicación puede usarse más en código backend. Por otro lado, la declarativa describe el resultado final. Sin embargo, hoy en día el objetivo es el uso de formas mixtas de paradigmas combinando ambas. Otro aspecto importante de la programación declarativa, es que no existe la asignación destructiva de variables, de hecho no existe el concepto de asignación de variables como en el caso de la imperativa. Así como hablar de transparencia referencial, es decir, al ejecutar una función determinada, esta no cambiará nada que se halla definido por fuera de su alcance.

# data[].attributes.body
La programación imperativa se basa en detallar los pasos/tareas que debe realizar la máquina, mientras que en la declarativa se especifica el resultado que queremos obtener sin especificar los pasos para lograrlo

# data[].attributes.body
En un lenguaje imperativo, declaramos todos y cada uno de los pasos que deben realizarse, donde vamos con el flujo lógico del programa y lo escribimos en pasos.

En lenguaje declarativo, simplemente especificamos lo que queremos y los lenguajes bajo el capó hacen el trabajo por nosotros y nos brindan el resultado, es decir no tenemos que decir los pasos que tiene que hacer.

# data[].attributes.body
En la programación imperativa un programa se describe mediante instrucciones, condiciones y pasos que permiten la mutación de variables mientras que en la declarativa se describe el programa mediante afirmaciones o proposiciones sin especificar pasos

# data[].attributes.attachment_link.readable_text
Programar es mucho más complejo que definir una serie de instrucciones para ser ejecutadas por un ordenador. La programación generalmente viene en diferentes colores, sabores y olores; es tan diversa como uno se lo pueda imaginar. A esta diversidad en el mundo de la programación se le conoce como paradigmas o estilos de programación.

Las características de un lenguaje de programación dictaminan el paradigma al cual pertenece, mientras algunos lenguajes pertenecen a un solo paradigma hay otros que pertenecen a múltiples. En esta entrada analizaremos los principales atributos de los dos estilos de programación mayormente usados: la programación imperativa y la programación declarativa.

Diagrama abreviado de paradigmas de programación.

Instrucciones o Declaraciones

En la programación imperativa, de la cual hacen parte muchos de los principales lenguajes de programación tales como , y , un programa se describe en términos de instrucciones, condiciones y pasos que modifican el estado de un programa al permitir la mutación de variables, todo esto con el objetivo de llegar a un resultado. En contraparte, en la programación declarativa un programa se describe en términos de proposiciones y afirmaciones que son declaradas para describir el problema, sin especificar los pasos para resolverlo; en este tipo de programas, el estado no puede ser modificado ya que todos los tipos de datos son inmutables. De esta familia hacen parte lenguajes como , , y

A continuación veremos dos implementaciones básicas para calcular el N-ésimo término de la sucesión de Fibonacci:

Función de javascript - Solución imperativa para calcular el N-ésimo término de la sucesión de Fibonacci.

Función de Erlang - Solución declarativa y funcional para calcular el N-ésimo término de la sucesión de Fibonacci.

Los lenguajes de programación imperativos generalmente hacen uso de procedimientos, rutinas o funciones impuras para establecer mecanismos de control, que potencialmente generan efectos secundarios y mutan el estado del programa durante su ejecución, a diferencia de los lenguajes de programación declarativos, en donde los mecanismos de control están dados por funciones o expresiones puramente matemáticas que carecen de efectos secundarios.

Estructuras Cíclicas de Control

La mayoría de lenguajes de programación imperativos tienen estructuras cíclicas de control tales como , , y para iterar sobre un determinado bloque de códigos dada una condición o expresión, mientras que la gran mayoría de lenguajes declarativos, especialmente los funcionales (subparadigma declarativo), carecen de este tipo de estructuras cíclicas, de hecho la única forma de representar un flujo cíclico es a través de la recursión (funciones que se llaman a sí misma) o través de funciones de alto nivel tales como y (que internamente usan recursión).

Función de Javascript - Implementación de la función map, haciendo uso de un for.

Función de Elixir - Implementación básica de la función map, haciendo uso de técnicas de pattern matching y recursión.

A continuación veremos dos implementaciones básicas de la función map, que transforma secuencialmente los elementos de una lista según lo especificado en la función anónima que se pasa como segundo parámetro:

Asignación Destructiva de Variables

Otro aspecto importante de la programación declarativa, es que no existe la asignación destructiva de variables, de hecho no existe el concepto de asignación de variables como se conoce comúnmente en la mayoría de lenguajes imperativos. El símbolo en los lenguajes de programación funcionales no es una asignación, es más como una aserción, ya que tiene un significado puramente algebraico, es decir cuando se escribe la expresión en realidad se está haciendo una igualdad, la cual solo puede ser verdadera si el valor de la derecha coincide con el valor de la izquierda.

En Erlang al igual que en muchos otros lenguajes declarativos, una vez una variable ha sido enlazada con un valor, esta no puede ser enlazada con otro valor, ya que esto implicaría la mutabilidad de las variables que traería consigo cambiar el estado del programa.

Por otra parte, en javascript una variable puede ser asignada múltiples veces, y debido a que es débilmente tipado es posible asignarle diferentes tipos de datos a una variable previamente asignada con otro tipo.

Transparencia Referencial

https://blog.penjee.com/wp-content/uploads/2015/02/pass-by-reference-vs-pass-by-value-animation.gif

En los lenguajes de programación declarativos, al no haber referencias variables, se puede decir con certeza que no hay efectos secundarios, es decir, al ejecutar una función determinada, esta no cambiará nada que se halla definido por fuera de su alcance. Tampoco dependerá para nada de lo que se haya definido por fuera de ese entorno. Se dice que una función tiene transparencia referencial si, para un valor de entrada, produce siempre la misma salida. Esta propiedad no se da en lenguajes imperativos, donde abundan los efectos colaterales por asignaciones destructivas; es decir, no hay garantía alguna de que al ejecutar un función, procedimiento o método, este no afecte algo que se haya definido en su exterior.

Esto tiene que ver mucho en la manera en que los argumentos de una función o método pasan al cuerpo del mismo. Una imágen, en este caso un GIF vale más que mil palabras para explicar cómo en los lenguajes declarativos siempre se pasan los argumentos por valor, mientras que en los imperativos no hay certeza de ello:

# data[].attributes.attachment_link.title
Paradigmas de Programación: Programación Imperativa y Programación Declarativa

# data[].attributes.attachment_link.description
Programar es mucho más complejo que definir una serie de instrucciones para ser ejecutadas por un ordenador. La programación generalmente viene en diferentes colores, sabores y olores; es tan diversa como uno se lo pueda imaginar. A esta diversidad en el mundo de la programación se le conoce como paradigmas o estilos de programación.

# data[].attributes.body
Investigar sobre las diferencias entre la programación imperativa y la programación declarativa.