Paradigmas de Programação

Modelos de Resolução

Paradigma de programação é um meio de se classificar as linguagens de programação baseado em suas funcionalidades.


🎯 O que são Paradigmas?

Definição Simples

Um paradigma é um molde ou modelo para se resolver um problema.

📺 Os Paradigmas da Programação | Explicados


🌳 Os Dois Grandes Grupos

Árvore de Paradigmas

Multiparadigma

Uma linguagem pode se encaixar em um ou mais paradigmas. A maior parte das linguagens que usamos no dia a dia são multiparadigma.

Importante

Alguns paradigmas são modificações ou evoluções de outros, ou seja, não são coisas completamente separadas.


⚖️ Imperativa vs Declarativa: Diferença Prática

Programação Imperativa

Você diz como algo deve ser feito, passo a passo.

numeros = [1, 2, 3, 4, 5]
soma = 0
for numero in numeros:
    soma += numero
print(soma)

Programação Declarativa

Você diz o que quer, e o sistema cuida de como fazer.

numeros = [1, 2, 3, 4, 5]
soma = sum(numeros)
print(soma)
AspectoImperativaDeclarativa
FocoComo fazerO que fazer
ControleDetalhadoAbstrato

1. Programação Imperativa

Conceito

Programas imperativos são uma sequência de comandos para o computador executar.

O nome paradigma Imperativo está ligado ao tempo verbal imperativo, onde o programador diz ao computador: faça isso, depois isso, depois aquilo…

Este paradigma se destaca pela simplicidade, uma vez que todo ser humano, ao se programar, o faz imperativamente, baseado na ideia de ações e estados.


📋 Elementos da Programação Imperativa

  • Definição de tipos de dados
  • Expressões e atribuições
  • Estruturas de controle de fluxo (programação estruturada)
  • Definição de sub-rotinas (programação procedimental)

✅ Vantagens

VantagemDescrição
EficiênciaEmbute o modelo Von Neumann
DominanteParadigma bem estabelecido
NaturalModelagem natural de aplicações do mundo real
FlexibilidadeTipagem fraca e muito flexível
AcessívelFácil de entender, usada em cursos introdutórios

🖥️ Arquitetura de Von Neumann

📺 O gênio que revolucionou a COMPUTAÇÃO

Ideia Central

Von Neumann pensou o computador como uma máquina que guarda dados e instruções no mesmo lugar (memória).

Componentes principais:

  1. Memória → onde ficam guardados tanto os dados quanto o programa
  2. CPU dividida em:
    • ULA (Unidade Lógica e Aritmética) → faz cálculos e comparações
    • UC (Unidade de Controle) → interpreta as instruções
  3. Dispositivos de Entrada e Saída → teclado, mouse, monitor, etc.

Arquitetura Von Neumann vs Harvard

Analogia

A arquitetura de von Neumann é como uma cozinha onde a receita (programa) e os ingredientes (dados) ficam guardados no mesmo armário (memória), e o chefe (CPU) busca, interpreta e executa passo a passo.


📝 Tipagem Fraca

O que é?

Tipagem fraca permite que operações sejam realizadas em variáveis de tipos diferentes sem conversão explícita.

AspectoDescrição
FlexibilidadeMais fácil de escrever código
ExemploEm JavaScript, "5" + 3 resulta em "53"
RiscosProblemas de depuração, comportamento imprevisível
LinguagensJavaScript, PHP, Python

❌ Desvantagens

  • Difícil legibilidade
  • Focaliza o “como” e não o “quê”
  • Relacionamento indireto com E/S (indução a erros/estados)
  • Tende a gerar códigos confusos quando a “gambiarra” toma conta

💻 Linguagens Imperativas

Ada, ALGOL, Basic, C, PHP, Java, Cobol, Fortran, Pascal, Python, Lua, Mathematica


1.1 Programação Estruturada

A programação estruturada surge como forma de dar maior controle sobre o fluxo de execução.

História

Desenvolvida por Michael A. Jackson em “Principles of Program Design” de 1975.


🔄 As 3 Estruturas Fundamentais

Sequência, Decisão e Repetição

EstruturaDescrição
SequênciaTarefas executadas linearmente
DecisãoTeste lógico determina execução
IteraçãoTrecho repetido por número finito de vezes

Exemplo Prático

import requests
 
# Sequência: requisita a cotação
url = "https://api.exchangerate-api.com/v4/latest/USD"
response = requests.get(url)
 
# Seleção: verifica se a resposta foi bem-sucedida
if response.status_code == 200:
    data = response.json()
    # Sequência: pega a cotação do dólar em relação ao Real
    dolar_brl = data["rates"]["BRL"]
    print("Cotação do dólar em reais:", dolar_brl)
else:
    print("Erro ao acessar a API.")

1.2 Programação Procedural (ou Modular)

A Programação Procedural é um dos paradigmas mais antigos e fundamentais.

Conceito

Procedimentos (funções/rotinas) são blocos de códigos que realizam tarefas específicas, permitindo decompor tarefas complexas em sub-tarefas menores.


📋 Características Principais

CaracterísticaDescrição
ProcedimentosBlocos de código para tarefas específicas
Fluxo SequencialExecução de cima para baixo
EscopoVariáveis com visibilidade limitada
ModularidadeDivisão em partes menores e testáveis

Vantagens e Desvantagens

VantagensDesvantagens
Simplicidade para aplicações menos complexasEscalabilidade difícil para sistemas maiores
Eficiência em memória e tempoReutilização desafiadora
Facilidade de depuraçãoEfeitos colaterais possíveis

Exemplo Prático

import requests
 
def buscar_cotacoes(base="USD"):
    """Busca as cotações a partir de uma moeda base"""
    url = f"https://api.exchangerate-api.com/v4/latest/{base}"
    response = requests.get(url)
    if response.status_code == 200:
        return response.json()
    else:
        return None
 
def pegar_cotacao(data, moeda="BRL"):
    """Extrai a cotação de uma moeda específica"""
    if data and "rates" in data:
        return data["rates"].get(moeda, None)
    return None
 
def exibir_cotacao(valor, moeda="BRL"):
    """Mostra a cotação formatada"""
    if valor:
        print(f"Cotação do dólar em {moeda}: {valor}")
    else:
        print("Não foi possível obter a cotação.")
 
# Programa principal (procedural)
dados = buscar_cotacoes("USD")
cotacao_brl = pegar_cotacao(dados, "BRL")
exibir_cotacao(cotacao_brl, "BRL")

1.3 Programação Orientada a Objetos (POO)

📺 Programação Orientada a Objetos | Explicação Simples

Conceito

Paradigma baseado em “objetos” que representam entidades do mundo real, contendo dados (atributos) e comportamentos (métodos).


🧱 Objetos e Classes

ConceitoDescrição
ObjetoInstância de uma classe com estado e comportamento
ClasseBlueprint/definição a partir da qual objetos são criados

Exemplos de Classes

Classe Carro:

  • Objetos: Toyota Corolla, Volkswagen Golf, Ford Mustang
  • Atributos: Cor, Modelo, Ano, Velocidade máxima
  • Métodos: Acelerar, Frear, Ligar faróis, Buzinar

Classe ContaBancaria:

  • Objetos: Conta de João, Conta de Maria
  • Atributos: Número da conta, Titular, Saldo
  • Métodos: Depositar, Sacar, Transferir, Ver saldo

🔑 Pilares da POO

PilarDescrição
EncapsulamentoDados privados, acessados por métodos
HerançaClasse filha herda da classe mãe
PolimorfismoObjetos diferentes com interface comum
AbstraçãoFoco nas características essenciais

Vantagens e Desvantagens

VantagensDesvantagens
Reusabilidade via herança e polimorfismoComplexidade adicional
Manutenção facilitada pelo encapsulamentoPode ser menos eficiente
Modelagem intuitiva do mundo realProgramas podem ficar extensos

Exemplo Prático

import requests
 
class Cambio:
    def __init__(self, base="USD"):
        self.base = base
        self.rates = {}
 
    def atualizar(self):
        url = f"https://api.exchangerate-api.com/v4/latest/{self.base}"
        self.rates = requests.get(url).json()["rates"]
 
    def cotacao(self, moeda="BRL"):
        return self.rates.get(moeda)
 
# Uso
c = Cambio()
c.atualizar()
print("Cotação do dólar em reais:", c.cotacao("BRL"))

2. Programação Declarativa

Conceito

No paradigma declarativo o programador não diz COMO o programa deve agir e sim O QUE ele deve retornar.

SQL é um exemplo clássico: você passa o que quer, e o banco de dados decide a melhor forma de trazer os dados.

Dica

É possível escrever de forma declarativa usando linguagens imperativas, utilizando encapsulamento para esconder detalhes de implementação.


2.1 Programação Funcional

Conceito

Trata a computação como avaliação de funções matemáticas, evitando estados ou dados mutáveis.

Exemplo matemático:


💻 Linguagens Funcionais

Erlang, Haskell, Lisp, Clojure, JavaScript (multiparadigma), Python (multiparadigma)

Característica

Em programação estritamente funcional, não há alocação explícita de memória nem declaração explícita de variáveis.

📺 Programação Funcional | Dicionário do Programador


2.2 Programação Lógica

Conceito

Paradigma baseado em formalismos da lógica matemática, onde programas são escritos em termos de relações e regras.


📋 Características Principais

CaracterísticaDescrição
DeclaratividadeDeclara conhecimento e consultas
BacktrackingBusca automática de soluções
RecursãoConceito fundamental
UnificaçãoCorrespondência automática de variáveis

Exemplo em Prolog

% Fatos representando relações parentais
parent(ana, bruno).
parent(paulo, bruno).
parent(bruno, carlos).
parent(bruno, diana).
 
% Regra para determinar avô/avó
grandparent(X, Y) :-
    parent(X, Z),
    parent(Z, Y).
 
% Regra para determinar irmãos
sibling(X, Y) :-
    parent(Z, X),
    parent(Z, Y),
    X \= Y.
 
% Consulta: Quem é o avô/avó de Carlos?
% ?- grandparent(X, carlos).

Linguagens lógicas: Prolog, Mercury


📝 Observações Finais

Diferença entre Procedimento e Função

TipoDescrição
ProcedimentoNão retorna valor
FunçãoGera um resultado que pode ser utilizado pelo programa

📚 Materiais Complementares

📺 Paradigmas de Linguagem de Programação