Paradigmas de programação – imperativo e declarativo

Olá!! ~ 🙂

No post passado, tivemos um vislumbre teórico sobre os paradigmas de programação e hoje vamos abordar a diferença entre os principais paradigmas: imperativo e declarativo. Apenas recapitulando, paradigmas de programação são padrões de como algo deve ser desenvolvido.

Dos paradigmas imperativo e declarativo nascem vários tipos de programação, como descrito no diagrama abaixo (o mesmo do post anterior, só que mais expandido):

“O quê” vs “como”

O paradigma imperativo costuma focar no como algo será feito, enquanto o paradigma declarativo foca no o quê será feito. Imagine que os dois são seus filhos e você precisa que eles vão no mercado comprar algo para você.

Para o filho imperativo, você instrui da seguinte forma: “filho, pegue esse dinheiro, abra a porta, saia, feche a porta, vá até o portão, abra, saia para a rua, feche o portão, ande até o mercado, entre lá, vá até a seção de ovos, pegue uma caixa de uma dúzia…” – enfim, todo o passo a passo.

Para o filho declarativo, você instrui assim: “filho, vá ao mercado e traga 12 ovos.

Ao programar com um paradigma imperativo, você descreve como cada passo será realizado. Já um código declarativo, você só precisa dizer o que quer. Uma query do MySQL é um ótimo exemplo de expressão declarativa. Por exemplo:

SELECT * from clientes WHERE cadastro = ativo;

Aqui, apenas foi pedido o que queremos: ver todos os clientes ativos. Mas como o banco fará essa busca? Ele vai ler linha por linha no banco e ir verificando com um if/else se o valor da coluna cadastro é “ativo”? Se fosse uma linguagem do paradigma imperativo, seria necessário descrever todos esses passos. Como é declarativo, não sabemos como o banco faz essa busca, não é o foco do paradigma.

Olhando o código

Confesso que é um pouco desafiador mostrar o quão diferente os dois paradigmas são na prática com apenas alguns pequenos trechos de código aqui, em cenários mais complexos é muito mais fácil de visualizar; quando há demanda de reuso de código e etc.

Porém, vamos utilizar o exemplo anterior e ver como seria um código de filtro de array simples em javascript (que é multi-paradigma) no modo imperativo e depois no modo declarativo:

Observe que no código imperativo, foi descrito um passo a passo de como a busca deveria ser feita e no código declarativo, apenas é dito o que é para ser feito: “filtra aí os que são ativos“.

Assim, o paradigma imperativo normalmente possui mais código do que o declarativo, que é menos explícito do que o imperativo.

Códigos imperativos e performance

Sawa, então o códigos do paradigma imperativo são bem maiores que os códigos declarativos. Como ele gasta menos energia e é mais performático do que o declarativo? Não faz sentido algum!” – Talvez você me questione, ao se lembrar da tabela de energia de cada paradigma do post anterior. É um questionamento válido, mas o princípio é simples: mais trabalho para você, menos trabalho para a máquina ;).

Programação imperativa, querendo ou não, é o pilar da computação e é como a CPU trabalha primariamente. Então, os códigos nesse padrão, são mais próximos das máquinas. Porém, com o avanço de hardware ao longo dos anos, essa diferença vai ficando cada vez mais insignificante.

Principais diferenças

Até agora entendemos que o paradigma imperativo implica em códigos que dão uma visão bem concreta para a máquina sobre como ela deve executar, enquanto que o paradigma declarativo envolve códigos mais sombrios porém mais “enxugados”. Vamos dar uma pontuada nas outras diferenças principais entre ambos os paradigmas.

Para facilitar, observe a lista geral de diferenças abaixo:

Uma forma prática para entender ainda melhor a diferença de ambos os paradigmas, é entendendo e utilizando seus sub-paradigmas.

Nos próximos posts, vamos entrar mais a fundo na programação funcional (do paradigma declarativo) e na programação orientada a objetos (paradigma imperativo).

Obrigada por chegar até aqui~!

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *