O que são?

Paradigmas de Programação são a padronização de um modelo que visa a resolução de problemas e o que rege todas as linguagens de programação. Os paradigmas foram criadas para padronizar as linguagens e manter o código organizado e compreensível. Por essa razão os paradigmas geram maior portabilidade entre as linguagens.

Neste artigo abordaremos os quatro paradigmas mais conhecidos:

  • Imperativo;
  • Funcional;
  • Estruturado;
  • Orientado a Objetos.

Algumas linguagens são multiparadigmas, ou seja, compreendem vários paradigmas dentro delas. Portanto, um paradigma não liga-se a uma linguagem de programação em si, mas as linguagens se adaptam aos paradigmas.

Por exemplo, a linguagem JavaScript aceita os paradigmas funcional e orientado a objetos. Semelhantemente, a linguagem C++ suporta os paradigmas de linguagem imperativa e orientada a objetos.

Programação Imperativa

Assim como o verbo no modo imperativo na língua portuguesa, na programação o modo imperativo expressa ordens ou pedidos.

Na programação imperativa a construção dos códigos costuma ser como ordens ao compilador, como, por exemplo, o comando do while da linguagem C. Esse comando pode ser interpretado como uma ordem de “faça <isso> enquanto <aquilo> for verdadeiro”.

Por exemplo:

int main(void){
  float nota1=0,nota2=0,media=0;
  int resp;
  
  do { //Faça, execute essa parte do código...
 
    printf("Digite a primeira nota: ");
    scanf("%f",&nota1);
    printf("Digite a segunda nota: ");
    scanf("%f",&nota2);
    
    media = (nota1 + nota2)/2;
    printf("Media do aluno = %f\n",media);
    
    printf("Digite 1 para continuar ou 2 para sair\n");
    scanf("%d", &resp);
  
  } while (resp==1); //enquanto resposta for == 1. quando isso não mais for verdade, o código é interrompido.
  
  return 0;
}

Programação Funcional

Pelo nome já dá para se ter uma ideia geral do que se trata esse paradigma: funções. No paradigma de programação funcional desenvolvemos o código pensando em usar funções para resolver problemas e chegar a um resultado. Criamos as funções com um propósito e as chamamos em determinados momentos do código.

Suas duas características principais são:

  • Imutabilidade;
  • Ausência de efeitos colaterais;

Imutabilidade

Ao usarmos constantes na programação funcional, não usamos declarações do tipo var e let (em JavaScript), apenas do tipo const, pois dessa forma evitamos modificações nos valores.

Dessa forma, podemos ter certeza que uma função sempre vai retornar um determinado resultado, independente de tentativas de substituição dos valores.

Ausência de Efeitos Colaterais

Como o código é imutável, por consequência ele é livre de efeitos colaterais. De novo trazendo a previsibilidade do código para a questão, quando se tem um código que não muda, claramente o resultado que ele gera é o mesmo.

Lembra um pouco aquela famosa frase sobre a definição de loucura:

    “Loucura é continuar fazendo a mesma coisa e esperar resultados diferentes”

Frase esta comumente atribuída a Albert Einstein. Do mesmo modo, não adianta continuar rodando um código imutável esperando que ele gere resultados diferentes.

O conceito de ausência de efeitos colaterais também está relacionado às funções puras, que usamos com frequência no paradigma funcional.

Programação Estruturada

O paradigma de programação estruturada busca priorizar a clareza lógica do código, fazendo isso por meio da estruturação. Para isso faz uso de três estruturas de controle básicas: sequência, seleção e iteração. Esse paradigma também tem a finalidade de evitar o uso do comando GO-TO.

Comando GO-TO

GO-TO era um comando usado em linguagens de programação antigas que permitia “saltos” de instruções, o que acabava por gerar uma confusão na interpretação do código. Na década de 60, Edsger W. Dijkstra criticou o uso excessivo desse comando, trazendo como argumentos as complicações para interpretar os códigos e as dificuldades que isso gerava para a manutenção destes.

As estruturas de controle: Sequência, Seleção e Iteração

Sequência

Implementa o passo-a-passo necessário para descrever qualquer programa, com os comandos um abaixo do outro.

faça tarefa 1
faça tarefa 2

Seleção

Considerando as sequências lógicas, selecionamos o processamento usando duas condicionais possíveis, a estrutura if then e a estrutura switch.

Iteração

É a repetição da execução de uma parte do código (loop) até que uma determinada condição seja atendida. Normalmente, implementamos com os comandos while e for.

Linguagens de Programação Estruturada

As linguagens mais conhecidas que seguem esse paradigma são as linguagens C e Pascal. A linguagem C teve grande relevância no desenvolvimento das linguagens Java, Python e C++, e continua sendo muito utilizada no meio acadêmico.

Programação Orientada a Objetos

Criado pela necessidade de reuso de código e facilidade de manutenção, esse tipo de programação pensa nas entidades do mundo real como classes que se relacionam.

Podemos entender as mais diversas entidades por meio da orientação a objetos. Por exemplo, um bolo vai ter um determinado nome, que geralmente descreve o seu sabor, e a maioria dos bolos é bem gostoso, então podemos ter o seguinte exemplo:

function Bolo (nome){
    this.nome = nome
    this.sabor = function(){
        return "Que bolo gostoso!"
    }
}

let bolo1 = new Bolo("Formigueiro")
let bolo2 = new Bolo("Chocolate")

console.log(bolo1.nome)//imprime Formigueiro
console.log(bolo2.nome)//imprime Chocolate

Bolo1 e o bolo2 são, comprovadamente, dois objetos diferentes, tanto por serem dois bolos de sabores diferentes, quanto pelo próprio teste feito pelo JavaScript:

console.log(bolo1 == bolo2)//retorna false!

Nesse exemplo, uma função construtora em JavaScript permite a reutilização da função Bolo para criar, por meio do operador new, novos objetos Bolo que sigam o padrão. Ou seja, objetos que têm uma característica (atributo) nome e um método sabor().

Podemos usar essa função construtora diversas vezes ao longo do código, demonstrando a questão da reutilização do código. Consequentemente, podemos corrigir os erros relacionados a esta função facilmente, pois basta se referir à função para corrigir quaisquer erros.