Design de software

OOP: o que é e como difere do código procedural?

Há uma frase que você inevitavelmente encontra ao estudar programação.

4 min de leitura
Imagem de capa de OOP: o que é e como difere do código procedural?

O que é programação orientada a objetos (OOP) e como ela difere da programação procedural?

Há uma frase que você inevitavelmente encontra ao estudar programação.

“Este código deve ser escrito de forma orientada a objetos.”

Ao ouvir isso pela primeira vez, é fácil ficar perdido. O que é programação procedural e o que torna a programação orientada a objetos tão diferente? Não é simples entender de imediato.

Vamos direto à conclusão. A programação procedural se concentra em “o que fazer e em que ordem”, enquanto a programação orientada a objetos enfatiza “quem é responsável por fazer”. A diferença está em manter os dados e as funções que os manipulam juntos ou separados.

Neste artigo, vamos explicar a diferença usando um pedido de café e mostrar como as duas abordagens mudam no código real.


Programação procedural é como uma receita de cozinha

Como o nome indica, a programação procedural se concentra nos procedimentos — ou seja, na sequência.

Existem dados e funções separadas para processá-los. O fluxo segue de cima para baixo, em ordem.

Uma receita de cozinha é uma analogia perfeita: lave os ingredientes, corte, refogue e sirva. Traduzir essa sequência diretamente para o código é programação procedural.

Vamos ver um exemplo simples de conta.

var balance = 10000  // Dados

func deposit(amount: Int) {   // Funcionalidades separadas
    balance += amount
}

deposit(amount: 5000)
print(balance)
// Saída: 15000

O dado balance fica exposto, e a função deposit o altera diretamente.

Em um programa pequeno, isso é até mais simples e rápido. O problema aparece quando o programa cresce.

Quando há 100 contas e as funções que alteram o saldo estão espalhadas, fica muito difícil rastrear onde um valor foi modificado.


O que é programação orientada a objetos (OOP)?

A programação orientada a objetos agrupa dados e funcionalidades. Esse agrupamento é chamado de “objeto”.

Em uma conta, isso significa reunir em uma unidade o dado “saldo” e a funcionalidade “fazer um depósito”.

Vamos transformar a conta anterior em um objeto.

class Account {
    private var balance = 10000   // Ocultar os dados internamente

    func deposit(_ amount: Int) { // Incluir também a funcionalidade
        balance += amount
    }
    func show() { print(balance) }
}

let myAccount = Account()
myAccount.deposit(5000)
myAccount.show()
// Saída: 15000

balance agora está oculto como private. O código externo não pode mais alterar o saldo livremente; o acesso ocorre apenas por caminhos definidos, como deposit.

Esse é o núcleo da programação orientada a objetos: proteger os dados e deixar claro “quem é responsável por cada tarefa”.

Pense em pedir café. Na programação procedural, eu moo os grãos, fervo a água e faço tudo sozinho. Na programação orientada a objetos, eu delego: “Barista, um americano, por favor”. O objeto barista sabe como prepará-lo e assume essa responsabilidade.


As 4 características fundamentais da OOP

A programação orientada a objetos tem quatro pilares. Os termos podem parecer difíceis, mas os conceitos são simples.

  • Encapsulamento: ocultar os dados e permitir acesso apenas por caminhos definidos (como private acima)
  • Herança: reutilizar funcionalidades herdando-as de uma classe existente
  • Polimorfismo: o mesmo comando se comporta de forma diferente em cada objeto
  • Abstração: ocultar a complexidade interna e expor apenas o necessário

O polimorfismo é especialmente poderoso. Se você manda “chore”, o cachorro faz au-au e o gato faz miau. O comando é o mesmo, mas cada objeto responde de forma diferente.

Um único objeto Account cuida do saldo e dos depósitos
Um único objeto Account cuida do saldo e dos depósitos

Quando usar OOP e quando a programação procedural é melhor

A programação orientada a objetos nem sempre é a resposta certa. A escolha depende da situação.

Situação Abordagem adequada
Scripts curtos, cálculos pontuais Programação procedural
Fluxo de dados simples e sequencial Programação procedural
Projetos grandes que continuam crescendo Programação orientada a objetos
Código desenvolvido por várias pessoas Programação orientada a objetos
Conceitos semelhantes aparecem repetidamente Programação orientada a objetos

Para algo pequeno e simples, o estilo procedural costuma ser mais limpo. Para código grande, complexo e mantido por muito tempo, a programação orientada a objetos mostra sua força.

Se é pequeno, siga a sequência; ao crescer e complicar, divida por responsabilidades
Para algo pequeno, seguir a sequência era mais prático; ao crescer e complicar, dividir por responsabilidades funcionava melhor

A programação procedural projeta a sequência; a programação orientada a objetos projeta as responsabilidades.

É assim que isso aparece em entrevistas

P. Qual é a maior diferença entre programação procedural e programação orientada a objetos? R. A relação entre dados e funcionalidades. A programação procedural separa dados e funções e flui com base na sequência, enquanto a programação orientada a objetos os agrupa em objetos e os gerencia por responsabilidade. Por isso, ela favorece a manutenção e a colaboração à medida que o sistema cresce.

P. Por que o encapsulamento é importante? R. Ele impede que o código externo altere os dados diretamente, reduzindo mudanças inesperadas. Como o acesso ocorre apenas por métodos definidos, fica mais fácil rastrear bugs, e alterar a implementação interna afeta menos o código externo.


Mesmo que a terminologia pareça grandiosa, a questão central é simples: “Como devemos lidar com os dados?”

Pratique agrupar pequenos trechos de código em objetos, e logo você entenderá. Tente refatorar uma parte do seu próprio código usando o que aprendeu hoje.

Leituras recomendadas