Esta disciplina caminha junto com Engenharia de Software: aqui você aprende com qual molde resolver cada problema; lá, como transformar isso em produto. Comece pela ponte entre as duas: Integração: Engenharia de Software e Paradigmas.
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.
Von Neumann pensou o computador como uma máquina que guarda dados e instruções no mesmo lugar (memória).
Componentes principais:
Memória → onde ficam guardados tanto os dados quanto o programa
CPU dividida em:
ULA (Unidade Lógica e Aritmética) → faz cálculos e comparações
UC (Unidade de Controle) → interpreta as instruções
Dispositivos de Entrada e Saída → teclado, mouse, monitor, etc.
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.
Aspecto
Descrição
Flexibilidade
Mais fácil de escrever código
Exemplo
Em JavaScript, "5" + 3 resulta em "53"
Riscos
Problemas de depuração, comportamento imprevisível
Linguagens
JavaScript, 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
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
Estrutura
Descrição
Sequência
Tarefas executadas linearmente
Decisão
Teste lógico determina execução
Iteração
Trecho repetido por número finito de vezes
Exemplo Prático
import requests# Sequência: requisita a cotaçãourl = "https://api.exchangerate-api.com/v4/latest/USD"response = requests.get(url)# Seleção: verifica se a resposta foi bem-sucedidaif 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ística
Descrição
Procedimentos
Blocos de código para tarefas específicas
Fluxo Sequencial
Execução de cima para baixo
Escopo
Variáveis com visibilidade limitada
Modularidade
Divisão em partes menores e testáveis
Vantagens e Desvantagens
Vantagens
Desvantagens
Simplicidade para aplicações menos complexas
Escalabilidade difícil para sistemas maiores
Eficiência em memória e tempo
Reutilização desafiadora
Facilidade de depuração
Efeitos colaterais possíveis
Exemplo Prático
import requestsdef 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 Nonedef 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 Nonedef 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")
A programação funcional em Python se apoia em três ferramentas centrais: map, filter e reduce. Elas transformam listas sem usar laços explícitos.
from functools import reducenumeros = [1, 2, 3, 4, 5]# map: aplica uma função a cada elementodobros = list(map(lambda x: x * 2, numeros))# [2, 4, 6, 8, 10]# filter: mantém apenas os que passam no testepares = list(filter(lambda x: x % 2 == 0, numeros))# [2, 4]# reduce: combina todos os elementos em um único valorsoma = reduce(lambda acc, x: acc + x, numeros)# 15print(dobros, pares, soma)
Funções Puras
Uma função pura sempre retorna o mesmo resultado para os mesmos argumentos e não produz efeitos colaterais (não altera variáveis externas, não imprime, não grava em disco). Isso facilita testes e depuração.
📊 Comparação: Laço vs Funcional (somar uma lista)
Abordagem
Código
Linhas
Efeito colateral?
Imperativa (laço for)
soma = 0; for n in nums: soma += n
2
Sim (modifica soma)
Declarativa (sum)
soma = sum(nums)
1
Não
Funcional (reduce)
reduce(lambda a, b: a+b, nums)
1
Não
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ística
Descrição
Declaratividade
Declara conhecimento e consultas
Backtracking
Busca automática de soluções
Recursão
Conceito fundamental
Unificação
Correspondência automática de variáveis
Exemplo em Prolog
% Fatos representando relações parentaisparent(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ãossibling(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
Tipo
Descrição
Procedimento
Não retorna valor
Função
Gera um resultado que pode ser utilizado pelo programa
🗺️ Taxonomia Completa dos Paradigmas
mindmap
root((Paradigmas))
Imperativo
Estruturado
Sequência
Decisão
Iteração
Procedural
Funções e Rotinas
Modularidade
Orientado a Objetos
Encapsulamento
Herança
Polimorfismo
Abstração
Declarativo
Funcional
Funções Puras
Imutabilidade
map/filter/reduce
Lógico
Fatos e Regras
Backtracking
Unificação
SQL / Consultas
SELECT / WHERE
Banco de Dados
🧭 Como Escolher um Paradigma?
flowchart TD
A([Tenho um problema a resolver]) --> B{Os dados têm\nrelações complexas?}
B -- Sim --> C{Preciso de\nconsultas/filtros?}
B -- Não --> D{O problema tem\nmuitos objetos\ndo mundo real?}
C -- Sim --> E[SQL / Declarativo]
C -- Não --> F[Funcional\nmap, filter, reduce]
D -- Sim --> G[Orientado a Objetos\nClasses e Herança]
D -- Não --> H{Preciso de\ncontrole fino\nde hardware?}
H -- Sim --> I[Imperativo/Procedural\nC, Assembly]
H -- Não --> J[Estruturado / Procedural\nPython, Pascal]
F --> K([Avalie performance\ne equipe: linguagem\nmultiparadigma cobre tudo])
G --> K
I --> K
J --> K
🌍 Cenário Atual: Paradigmas em Alta (2025-2026)
Panorama da Indústria (Stack Overflow Developer Survey 2025)
JavaScript lidera uso geral (66% dos desenvolvedores)
Python cresceu 7 pontos percentuais de 2024 para 2025, impulsionado por IA e ciência de dados
Rust é a linguagem mais admirada (72%), com forte suporte a paradigmas funcionais
Segundo o IEEE Spectrum (2025), pouquíssimas empresas escolhem um único paradigma. O padrão moderno é combinar OOP com funcional: classes organizam o domínio; funções puras processam dados sem efeitos colaterais. Python, Kotlin, TypeScript e Scala fazem isso nativamente.
🧪 Atividades Mão na Massa
🧪 Atividade 1: O Mesmo Problema em 3 Paradigmas no Python Tutor
Objetivo: ver com seus próprios olhos como cada paradigma executa a soma de uma lista.
Ferramenta:pythontutor.com (sem instalação, roda no navegador)
Passo 1: Acesse pythontutor.com, clique em “Start visualizing your code now” e selecione Python 3.
Passo 2: Cole o código abaixo e clique em “Visualize Execution”: