Declarativo vs. Imperativo
Um paradigma de programação é um estilo fundamental de programação de computadores. Existem quatro paradigmas principais: imperativo, declarativo, funcional (que é considerado um subconjunto do paradigma declarativo) e orientado a objetos.
Programação declarativa : é um paradigma de programação que expressa a lógica de uma computação (O que fazer) sem descrever seu fluxo de controle (Como fazer). Alguns exemplos conhecidos de linguagens declarativas de domínio específico (DSLs) incluem CSS, expressões regulares e um subconjunto de SQL (consultas SELECT, por exemplo) Muitas linguagens de marcação como HTML, MXML, XAML, XSLT ... geralmente são declarativas. A programação declarativa tenta embaçar a distinção entre um programa como um conjunto de instruções e um programa como uma afirmação sobre a resposta desejada.
Programação imperativa : é um paradigma de programação que descreve a computação em termos de declarações que alteram o estado de um programa. Os programas declarativos podem ser visualizados dupla- mente como comandos de programação ou asserções matemáticas.
Programação funcional: é um paradigma de programação que trata a computação como a avaliação de funções matemáticas e evita dados de estado e mutáveis. Ele enfatiza a aplicação de funções, em contraste com o estilo de programação imperativa, que enfatiza as mudanças de estado. Em uma linguagem funcional pura, como Haskell, todas as funções não têm efeitos colaterais e as alterações de estado são representadas apenas como funções que transformam o estado.
O exemplo a seguir de programação imperativa no MSDN , percorre os números de 1 a 10 e localiza os 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 os exemplos produzem o mesmo resultado, e um não é nem melhor nem pior que o outro. O primeiro exemplo requer mais código, mas o código é testável e a abordagem imperativa fornece controle total sobre os detalhes da implementação. No segundo exemplo, o código é indiscutivelmente mais legível; no entanto, o LINQ não fornece controle sobre o que acontece nos bastidores. Você deve confiar que o LINQ fornecerá o resultado solicitado.