Entendendo as diferenças: Imperativo vs Declarativo

Entendendo as diferenças: Imperativo vs Declarativo

Este é um tema muito interessante. Se você é experiente na área de desenvolvimento ou não, é bom saber a diferença entre um código Imperativo e Declarativo. Além disso surge um questionamento. A forma que programo se encaixa em qual dos dois conceitos? Vamos entender melhor as principais diferenças desses códigos e ver com exemplos que vão deixar bem claro!

Imperativo

Um código imperativo diz como algo deve ser feito. Ele entra nos detalhes e ensina passo a passo como executar até chegar no resultado esperado. Vamos dar um exemplo que pode ter ocorrido com você na vida real:

Vamos supor sua mãe tenha te pedido para comprar algo no supermercado. No contexto imperativo ela pediria da seguinte forma. Filho vá ao mercado, compre frutas e leite, para isso vou te dar esse dinheiro. Você precisa colocar seu tênis, andar até a porta, abrir e depois fechar a porta, andar 300 metros, entrar no mercado e depois comprar as coisas que estão na lista. Tem que colocar as compras no caixa, pagar a compra e voltar para casa com as elas. Viu que no contexto imperativo, tivemos que descrever cada passo até chegar no resultado?

No código imperativo temos características como:

  • O código é mais explicito. Tem mais linhas. Já que explicamos como as coisas devem ser feitas, é de se esperar que o código seja maior.

  • Mais conhecido. Muitos desenvolvedores estão adaptados a essa forma de escrever o código.

  • Foco no fluxo do código: Dizemos como as coisas devem ser feitas, consequentemente vamos escrevendo o fluxo do código passo a passo.

  • Tem estados mutáveis: é um objeto (variável) cujo estado pode ser modificado após sua criação, e essas alterações podem ocorrer várias vezes.

  • Possui um baixo nível de escalabilidade.

Veja este exemplo de um código imperativo :

const comprasTotal = [10, 20]

function calcularTotal(comprasTotal){
    let total = 0 
    for (let i = 0; i <comprasTotal.length; i++) {
         total += comprasTotal[i];
    }
    return total
}

const totalGeral = calcularTotal(comprasTotal)
console.log(`Total das compras foi de ${totalGeral}`);

No código acima temos um array com dois elementos em formato numérico que é a const comprasTotal. Depois dizemos como queremos que o calculo seja feito percorrendo o array, onde determinamos um laço for. Resumindo isso, estamos praticamente ditando como queremos que as coisas sejam feitas. O resultado desse código será o soma dos dois elementos do array:

image.png

Declarativo

Um código declarativo é ao contrário. Ele não diz como deve ser feito, nos mínimos detalhes e passo a passo, mas apenas diz o que deve ser feito. Voltando para o exemplo que usamos anteriormente. Se sua mãe te pedisse para ir ao mercado, ela apenas te diria o que deveria ser feito: "Filho vá ao mercado, compre leite e frutas, leve esse dinheiro para pagar as compras".

Então começamos a perceber que o objetivo é deixar as coisas mais simples em nosso código, com foco na lógica. As características de um código declarativo são:

  • Os dados que já existem nunca podem ser alterados, mas são gerados novos dados, como se fosse uma evolução dos dados anteriores. Esse é um conceito chamado Imutabilidade, que é bem mais profundo de se analisar.

  • Foco na lógica! Mas isso não quer dizer necessariamente que não precisamos nos preocupar com o fluxo do código.

  • O que deve ser feito! Somar, subtrair, calcular algo, fazer uma verificação de condição, entre outras coisas. Mas nunca vamos detalhar passo a passo.

  • Temos como escalar em alto nível.

  • Temos um código menos explícito. As vezes quando está analisando um código declarativo, você verá poucas linhas, mas muita coisa está sendo feita por de trás de uma função, map(), reduce(), filter() entre outras.

Vamos ver como ficaria a mesma operação de somar, usando o paradigma declarativo:

const nums = [10, 20]

const somar = (acc, el) => acc + el
const total = nums.reduce(somar)
console.log(total);

O resultado será o mesmo:

image.png

Viu como o código ficou bem reduzido? É importante que você veja a diferença para que fique claro. Por trás da função (método) reduce, muitas operações estão sendo feitas, mas apenas vemos a superfície, porque o foco é a lógica sem ter que ditar passo a passo o fluxo da operação. Espero que tenha ficado claro.

Conclusão

As diferenças são claras! É importante você entender que a programação não envolve apenas linguagens diferentes. Mas envolve muito mais do que isso, a lógica, fluxo do código, regras de negócio e muitas coisas que podemos ao passo que evoluímos. Existem conceitos como Imutabilidade e programação reativa, além de muitos outros conceitos profundos a serem explorados. Vou tentar abordar esses temas nos próximos artigos!

Agradeço mais uma vez por ler até o final, caso tenha alguma dúvida ou sugestão entre em contato comigo pelo LinkedIn ou deixe um comentário. Muito obrigado e até o próximo post! 😉🚀