Programação imperativa e declarativa
Tags: productivity, javascript, codequality, declarative
Published: 2020-07-12 13:16:33

Hoje em dia, programar se tornou a principal rotina das pessoas inseridas no mercado da tecnologia. Seja na programação de front-end, back-end, ciência de dados, microcontroladores, dentre outras. 

Muitos de nós encaramos a programação como uma especie de ordem, onde você indica ao computador o que você quer, por meio de códigos, e ele lhe devolverá da forma correta.
Deste pensamento, surgiram as linguagens de programação como conhecemos hoje com estruturas de repetição e condição. É por esse meio que conhecemos hoje a **Programação Imperativa**.

### O que é uma programação imperativa

A grande parte das linguagens de programação se baseiam em procedimentos, e tentam com isso, abordar situações e funcionamentos reais. Como a programação é um *meio* e não um *fim*, o processo natural do programador é focar em como resolver determinado problema, sem, muitas vezes, verificar e consolidar sua solução.

![Man pointing to computer](https://dev-to-uploads.s3.amazonaws.com/i/itarqrje0j13tenwivlu.jpg)

A programação imperativa surgiu do fato que, por meio de códigos, o programador escrever situações que indicam algo ao computador por meio da conjugação imperativa dos verbos, seguindo sempre um método *estruturado* e sequencial das coisas.

* Se acontecer isso > Faça isso
* Caso A seja igual a B > Produza esse bloco
* Enquanto existir C > Faça D aparecer 

E são dessas situações que muitos códigos de varias linguagens podem demostrar essa situação. Vejamos alguns abaixo:

If Else em Lua
```lua
    if op == "+" then
      r = a + b
    elseif op == "-" then
      r = a - b
    elseif op == "*" then
      r = a*b
    elseif op == "/" then
      r = a/b
    else
      error("invalid operation")
    end
```

For em Python

```python
for item in [3,4,5,6,7]:
    print(item)
```

While em Java
```java
public class while {
    public static void main(String args[]) {
        int cont = 0;
        while (cont < 50) {
            System.out.println("Repeat: " + cont);
            cont++;
        }
    }
} 
```
#### Vantagens

Programar imperativamente é o **modelo mais aproximado do que poderíamos ver no mundo real** entre a iteração humano-computador. **Seu entendimento é fácil** em níveis iniciais e é **eficiente** na maioria dos casos, se tornando o modelo geral de varias linguagens.

#### Desvantagens 

Apesar de tudo isso, a programação imperativa em projetos grandes tem **difícil legibilidade e manutenibilidade**, focando sempre em **como a tarefa deve ser feita** e não em **o que deve ser feito**, gerando tratamentos de dados **confusos** e programas mais suscetível a erros.

### E onde entra a programação declarativa?

A programação declarativa é um conceito que fundamentou muitas linguagens existentes na atualidade, popularizando-se com o Javascript, e algumas já consolidadas como o SQL.

A programação declarativa se centra em **o que deve ser solucionado**, e busca com isso, codigos limpos, livres de complexidade e de abordagens estruturais, onde o foco é a lógica, manutenção e diminuição de efeitos colaterais. Isso favorece o código *reutilizável*, *legível* e *sucinto*.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/uh9b0g4mc1e9l3oqvu6u.png)

#### Que tal um exemplo?

O Javascript consegue utilizar ambas abordagens. Veja abaixo um código que acrescenta "I Love" em um array de linguagens.

```javascript

let languages = ["python", "java", "go", "ruby"];
// Imperative

for(let i = 0; i < languages.length; i++){
   languages[i] = "I love "+ languages[i];
}
// Return: ["I love python", "I love java", "I love go", "I love ruby"]

// Declarative

languages.map(language => "I love" + language);

// Return: ["I love python", "I love java", "I love go", "I love ruby"]

```

Perceba que, no código declarativo, não houve nenhuma indicação ao computador de como ele deveria fazer o processo, mas sim, lendo o próprio código, percebemos que ele irá mapear o array, e retornar o que queríamos. O código se tornou mais limpo, menos verboso e facilmente replicável. 

Porém, nem tudo são flores, utilizar o código declarativo exige um estudo maior, além de uma adaptação difícil, que é resultante de hábitos antigos em linguagens imperativas.

#### Vantagens

* Reduzir efeito colaterais
* Legibilidade
* Redução de bugs

#### Desvantagens

* Difícil adaptação
* Elevada complexidade de utilização

### Veredito Final

Hoje em dia, a programação funcional, e consequentemente, declarativa, tem se tornado 
o padrão de código da atualidade.Esse crescimento facilita com que novas linguagens possam se adaptar a isso e gerar programas mais legíveis com maior desempenho.

**A programação é um meio, não um fim.**

Obrigado pela leitura!