Paradigmas de Programação

Giovanna Moeller
6 min readSep 20, 2022

Você já pode ter ouvido falar em alguns termos como programação imperativa, declarativa, ou até mesmo orientada a objetos. Mas o que tudo isso significa?

O que são paradigmas de programação?

Paradigmas de programação nada mais são do que estilos, modos, jeitos que você pode escrever e estruturar o seu programa em determinada linguagem de programação. Portanto, é um conceito que está muito mais ligado a ideias e práticas a serem seguidas.

Cada paradigma contém diferentes funcionalidades, estruturas e opiniões sobre como alguns problemas convencionais em programação devem ser resolvidos.

É importante ressaltar que não existe um melhor paradigma de programação, assim como não existe uma melhor linguagem de programação. Cada um resolve melhor um determinado tipo de problema, portanto faz sentido usarmos diferentes paradigmas em diferentes projetos.

Para finalizar este tópico, linguagens de programação nem sempre estão ligadas a um certo paradigma, embora existam linguagens que foram construídas com um certo paradigma em mente. Entretanto, existe o que chamamos de linguagem "multi-paradigma", o que significa que podemos adaptar o nosso código a um ou mais paradigmas, o que fizer mais sentido para o seu programa. Javascript é um bom exemplo disso.

Explorar mais sobre paradigmas pode te ajudar a abrir sua mente e pensar fora da caixa, entendendo que há diversas maneiras de resolver um mesmo problema.

Principais Paradigmas de Programação

Nesse artigo, vamos abordar os seguintes paradigmas:

  • Imperativo;
  • Procedural;
  • Funcional;
  • Declarativo;
  • Orientado a objetos.

Imperativo

Imperativo, como um adjetivo, especifica uma ordem, pede para algo ser feito. Como um paradigma de programação, faz a mesma coisa: especifica um conjunto de instruções que deve ser executado pelo computador em uma ordem específica.

É chamado de "imperativo" pois os programadores ditam exatamente o que o programa precisa realizar em uma ordem muito específica. Especificamos com detalhe as instruções.

Primeiro faça isso, e depois faça aquilo.

É uma abordagem um pouco mais antiga e primitiva, mas não deixa de ser importante para o entendimento, já que ainda é muito utilizada em programas mais simples e pouco complexos, visto que sua escalabilidade é muito difícil, porém sua implementação é fácil.

Vamos ver um exemplo de código escrito de forma imperativa, utilizando a linguagem de programação Javascript, que é uma linguagem multiparadigma:

O foco principal do paradigma imperativo está em como atingir o objetivo do programa.

Nesse código, especificamos o array inicial e o array do resultado final como vazio. E então, percorremos um loop que adiciona o valor duplicado para o array final. Perceba que os passos estão muito bem definidos e há uma ordem exata a ser seguida.

Procedural

É um paradigma que deriva do imperativo (sua abordagem ainda é imperativa), porém o paradigma procedural consiste na reutilização, organização e modularização do seu código através de funções e subrotinas, procedimentos.

Veja um exemplo abaixo, utilizando o mesmo código acima, porém agora com a abordagem procedural:

Note que utilizamos de funções, melhorando a reusabilidade e modularização do nosso código.

Declarativo

Esse paradigma entra em contraste com o imperativo. No paradigma imperativo, especificamos como um programa deve executar uma tarefa, resolver um problema. Já no paradigma declarativo, nós não nos importamos em como o programa irá resolver determinada tarefa, tudo com o que nos preocupamos é em chegar no resultado em si.

Com o paradigma declarativo, há o grande uso de funções recursivas propostas por algumas linguagens, como por exemplo: 'map', 'find', 'filter', entre outros. Não se sabe exatamente o que acontece por baixo dos panos com esses métodos, ou melhor, não há uma preocupação em relação a isso. Tudo que queremos é chegar no resultado desejado.

Há uma certa preocupação em esconder toda a complexidade e aproximar as linguagens de programação da linguagem e do pensamento humano.

Vamos ver o mesmo exemplo que foi demonstrado no paradigma imperativo, porém agora com o uso do paradigma declarativo, usando a linguagem de programação Javascript, que também permite essa abordagem:

O foco principal do paradigma declarativo está em apenas atingir o objetivo do programa, sem se importar em como fará isso.

Um outro exemplo interessante é a biblioteca React, que utiliza um paradigma declarativo com o objetivo de fornecer aos desenvolvedores uma interface mais amigável e eficiente para trabalhar.

Por exemplo, o uso de hooks. Não sabemos exatamente como funcionam por baixo dos panos, apenas utilizamos para facilitar a manipulação e utilização dos nossos dados na aplicação.

Uma coisa importante a ser observada sobre a programação declarativa é que, por baixo dos panos, o computador processa essas informações como código imperativo de qualquer maneira. Afinal, um computador não é muito inteligente.

Seguindo o nosso exemplo com o uso do 'map', o computador ainda itera sobre o array como em um loop tradicional (for), mas nós como programadores não precisamos codificar isso diretamente. O que a programação declarativa faz é esconder essa complexidade do programador.

Funcional

Assim como o paradigma procedural faz parte do paradigma imperativo, o paradigma funcional faz parte do paradigma declarativo.

Esse paradigma leva o conceito de funções um pouco mais adiante e afundo. Vamos entender o porquê.

Na programação funcional, as funções são tratadas como "cidadãos de primeira classe", o que significa que podem ser atribuídas a variáveis, passadas como argumentos e retornadas de outras funções, o que você pode encontrar como "closures" ou "high-order-functions".

Há também um outro conceito muito importante que faz parte desse paradigma: funções puras. Essas funções possuem duas propriedades principais. Primeiro, elas sempre produzem a mesma saída para os mesmos argumentos, independentemente de qualquer outra coisa.
Em segundo lugar, elas não têm efeitos colaterais, ou seja, não modificam argumentos, variáveis ​​locais/globais ou fluxos de entrada/saída. A ausência de efeitos colaterais pode fazer com que a frequência de erros inesperados seja diminuída e a legibilidade/segurança aumente.

Um exemplo muito simples de função pura é a soma de dois valores, independente das variáveis, o resultado será sempre o mesmo: a soma dessas duas variáveis.

Portanto, o paradigma funcional incentiva que os programas sejam escritos majoritariamente com o uso de funções, causando uma modularização do código, aumentando a capacidade de manutenção e reutilização do mesmo.

Com esse conceito de funções puras e efeitos colaterais, vamos ver um exemplo abaixo:

Note que esse código representa uma função impura, pois modifica diretamente o objeto 'student' que foi passado como argumento. E como objetos são tratados como um valor de referência no Javascript, acontecerá um efeito colateral também no objeto original que foi passado como argumento, independente de houver um retorno ou não.

Vamos refatorar essa função para uma função pura:

Note que agora o objeto 'student' não está sendo modificado pela função. Estamos retornando um novo objeto que contém todas as propriedades do objeto passado (student) e reatribuindo o valor da propriedade 'averageGrade'. Não estamos reescrevendo o objeto 'student' e sim retornando um novo objeto com as mesmas características. Não há efeitos colaterais.

Orientado a Objetos

Esse paradigma é muito comum e utilizado. Orientação a objetos baseia-se no conceito de classes, atributos (propriedades, variáveis) e métodos (funções).

Vamos pensar em um exemplo muito clássico: uma pessoa. Uma pessoa possui atributos, como altura, peso, idade, nome. Uma pessoa também possui métodos, como falar, andar, comer, entre outros.

Portanto na programação orientada a objetos, há a modelagem de conceitos do mundo real através de objetos. Também há a presença de outros conceitos como herança (capacidade de herdar características), polimorfismo, encapsulamento, abstração…

Essa abordagem é muito utilizada em grandes projetos, complexos, porque consegue encapsular muito bem os conceitos e deixar o código mais manutenível, reutilizável e escalável.

Vamos ver um exemplo a seguir desse paradigma.

Curiosidade: Javascript não foi uma linguagem projetada para seguir esse paradigma, no início, não existia uma forma de criar classes (essa funcionalidade surgiu apenas com o ES6, em 2015). Ainda assim, conseguíamos utilizar desse paradigma através de objetos.

O interessante da programação orientada a objeto (OOP) é que ela facilita o entendimento de um programa, pela clara separação de preocupações e responsabilidades.

Conclusão

Nesse artigo vimos mais sobre diferentes paradigmas de programação e como eles se comportam.

Caso você tenha alguma dúvida, pode entrar em contato comigo nas minhas redes sociais: https://giovannamoeller.com.

Até a próxima!

--

--