Declarativo versus imperativo
Un paradigma de programación es un estilo fundamental de programación de computadoras. Hay cuatro paradigmas principales: imperativo, declarativo, funcional (que se considera un subconjunto del paradigma declarativo) y orientado a objetos.
Programación declarativa : es un paradigma de programación que expresa la lógica de un cálculo (Qué hacer) sin describir su flujo de control (Cómo hacerlo). Algunos ejemplos bien conocidos de lenguajes específicos de dominio declarativo (DSL) incluyen CSS, expresiones regulares y un subconjunto de SQL (consultas SELECT, por ejemplo) Muchos lenguajes de marcado como HTML, MXML, XAML, XSLT ... a menudo son declarativos. La programación declarativa intenta difuminar la distinción entre un programa como un conjunto de instrucciones y un programa como una afirmación sobre la respuesta deseada.
Programación imperativa : es un paradigma de programación que describe la computación en términos de declaraciones que cambian el estado de un programa. Los programas declarativos pueden verse de manera dual como comandos de programación o aserciones matemáticas.
Programación funcional: es un paradigma de programación que trata la computación como la evaluación de funciones matemáticas y evita el estado y los datos mutables. Enfatiza la aplicación de funciones, en contraste con el estilo de programación imperativo, que enfatiza los cambios de estado. En un lenguaje funcional puro, como Haskell, todas las funciones no tienen efectos secundarios, y los cambios de estado solo se representan como funciones que transforman el estado.
El siguiente ejemplo de programación imperativa en MSDN , recorre los números del 1 al 10 y encuentra los números pares.
var numbersOneThroughTen = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
//With imperative programming, we'd step through this, and decide what we want:
var evenNumbers = new List<int>();
foreach (var number in numbersOneThroughTen)
{ if (number % 2 == 0)
{
evenNumbers.Add(number);
}
}
//The following code uses declarative programming to accomplish the same thing.
// Here, we're saying "Give us everything where it's odd"
var evenNumbers = numbersOneThroughTen.Select(number => number % 2 == 0);
Ambos ejemplos producen el mismo resultado, y uno no es ni mejor ni peor que el otro. El primer ejemplo requiere más código, pero el código es comprobable y el enfoque imperativo le brinda control total sobre los detalles de implementación. En el segundo ejemplo, el código es posiblemente más legible; sin embargo, LINQ no le da control sobre lo que sucede detrás de escena. Debe confiar en que LINQ proporcionará el resultado solicitado.