Paradigmas de Programação
Tags: todayilearned, computerscience, sql, javascript
Published: 2020-01-12 17:15:47

Eaí pessoal, beleza? 😎

Hoje irei falar sobre paradigmas de programação. Pretendo fazer uma série de posts sobre o tema pois acredito que é um tópico que pode se estender muito por conta da sua complexidade. Nesse post irei falar sobre dois dos principais paradigmas, o declarativo e o imperativo.

Irei tentar explicar de forma resumida e concisa assim qualquer dúvida deixe seu comentário que tentarei responder da forma mais rápida possível!

Ok, vamos lá. 

Você deve estar se perguntando...

## Porque saber isso é importante? 🤔

Bom, após meu parceiro de trabalho me bombardear com esses termos de "Paradigma" e "Abstração" dia sim e dia não eu decidi entender o que isso significava e porque eles pareciam ser bem importantes. Acontece que eu cheguei a conclusão que saber o que é um paradigma imperativo e declarativo é importante por duas razões: 

1. Te ajuda a entender melhor a diferença entre programação orientada a objeto, programação procedural e programação funcional. Entendendo esses cinco termos é possível entender de onde os autores tiram seus designs de código. 
2. Saber algo desse nível te deixa diferenciado numa entrevista de emprego.

Antes de continuar, entenda que todos esses cinco termos são considerados *paradigmas de programação*, porém Imperativo e Declarativo são considerados "pais" na hierarquia em relação a procedural, Programação Orientada a Objeto (POO) e funcional.

Tá, eu entendi isso. Mas afinal...

## O que é um Paradigma?

A palavra paradigma é derivada do Grego *paradeiknyai*, ela se refere comumente ao método de pensar em um problema ou uma situação.

Dessa forma um paradigma de programação é um meio de se classificar as linguagens de programação baseado em suas funcionalidades. As linguagens podem ser classificadas em vários paradigmas. Assim, um paradigma de programação fornece e determina a visão que o programador possui sobre a estruturação e execução do programa.

## Paradigmas Imperativos

![](https://i.giphy.com/media/BRH9RY5fSpDyM/giphy.gif)

### Explicação mais técnica: 👨‍💻

São paradigmas de programação que usam declarações imperativas para alterar o estado de um programa. Da mesma forma que declarações imperativas funcionam na linguagem natural, a declaração imperativa na programação consistem em comandos para o computador realizar. Assim, programação imperativa foca em descrever ***COMO*** um programa funciona.

São o oposto de paradigmas declarativos, estes focam ***NO QUE*** o programa deve realizar sem especificar o ***COMO*** o programa deve alcançar esse resultado.

Programas escritos dessa forma imperativa geralmente compilam em binários executáveis que rodam mais eficientemente já que todas as instruções da CPU são em si declarações imperativas.

Algumas das linguagens mais famosas que seguem exclusivamente o paradigma imperativo são C, Pascal, Fortran e Cobol.

### Explicação mais prática: 😋

Se formos levar o problema para a construção de uma casa, temos que o paradigma imperativo se trata de ***COMO*** construir a casa. Assim, para escrever um programa que constrói uma casa eu faria algo do tipo:

1. Construa a fundação
2. Coloque as vigas
3. Instale as utilidades
4. Adicione as paredes
5. Finalize os toque finais

Nesse tipo de programação eu disse exatamente (~~nem tanto, mas você entendeu~~) quais passos é preciso tomar para montar uma casa. 

## Declarativos

![](https://i.giphy.com/media/Qa5dsjQjlCqOY/giphy.gif)

### Explicação mais técnica: 👨‍💻

É um paradigma que permite o desenvolvedor definir o que o programa ***DEVE*** realizar do que definir exatamente como ele deve realiza-lo. Essa abordagem geralmente considera programas como teorias de uma lógica formal e computações como deduções dessa lógica no espaço. Esse paradigma tem o benefício de simplificar a programação de algumas aplicações de processamento paralelo.

Uma linguagem que é considerada referência no paradigma declarativo é o SQL.

### Explicação mais prática: 😋

Paradigma Declarativo trata sobre ***O QUE***. Usando o exemplo da casa, teríamos um programa da seguinte forma:

1. Eu não dou a mínima para o jeito que você constrói, mas eu quero uma boa varanda, um cozinha grande e um quarto com um banheiro.

Nesse tipo de programação eu digo o que espero de saída do programa. Eu sei que nesse caso, se eu der os inputs em forma de dinheiro eu terei os resultados desejados para casa.

## É tudo sobre Abstração 🐱‍🐉

Todos os programadores utilizam um monte a palavra "abstração". Uma abstração é retirar todos os detalhes minuciosos de um assunto para fala-lo em um conceito high-level. Imagina que você está na casa que seu programa fez, está tomando um banho e percebe que não sai água quente do chuveiro, você não quer saber todos os passos que existem para que a água quente caia na sua cabeça. Você quer apenas que água quente saia do chuveiro! Isso é abstração.

Assim, paradigmas declarativos permite a abstração, já os imperativos não.

## Vejamos um exemplo básico em código!

Programação Declarativa em SQL:

```sql
SELECT * FROM Users WHERE Country = 'Canada';
```

Veja que não nos preocupamos em como ele irá pegar as informações e sim no que trazer de informação!

Agora um na forma Imperativa em Javascript:

```javascript
function double (arr) {
  let results = []
  for (let i = 0; i < arr.length; i++){
    results.push(arr[i] * 2)
  }
  return results
}
```

Aqui vemos que temos que especificar exatamente o que deve ser feito!


![](https://i.giphy.com/media/2YgCmRh9Arduw8LshF/giphy.gif)

Esse foi o primeiro post da série, espero que gostem e até a próxima!

LINKS/Referências:

https://pt.wikipedia.org/wiki/Paradigma

https://en.wikipedia.org/wiki/Imperative_programming

https://www.computerhope.com/jargon/i/imp-programming.htm

https://www.computerhope.com/jargon/d/declarprog.htm

https://zachgoll.github.io/blog/2019/imperative-vs-declarative-programming/ (Post Fortemente Inspirado nesse link)

https://tylermcginnis.com/imperative-vs-declarative-programming/ (Referências de código)