DEV Community

Yuri Peixinho
Yuri Peixinho

Posted on

Programação Orientada a Objetos

Introdução

Programação Orientada a Objetos é um paradigma (um jeito de organizar código) onde você modela o problema como um conjunto de objetos que têm estado (dados) e comportamento (métodos), em vez de modelar como uma sequência de instruções que manipulam dados soltos.

A ideia central: em vez de separar "dados" de um lado e "funções que mexem nos dados" do outro, você agrupa os dois numa única unidade — o objeto.

Pra que serve / que problema resolve

Antes da POO ficar popular, a programação era predominantemente procedural: um monte de funções manipulando estruturas de dados globais ou passadas por parâmetro. Isso funciona bem em programas pequenos, mas cresce mal:

// Estilo procedural
struct ContaBancaria
{
    public decimal Saldo;
}

void Sacar(ref ContaBancaria conta, decimal valor)
{
    conta.Saldo -= valor; // nada impede alguém de fazer conta.Saldo = -9999 direto
}
Enter fullscreen mode Exit fullscreen mode

Qualquer parte do código pode mexer em Saldo sem passar pelas regras de negócio. Conforme o sistema cresce, fica impossível garantir que os dados estão sempre num estado válido.

A POO ataca esse problema principal: acoplar dados às regras que os protegem, e além disso:

  • Organiza sistemas grandes em pedaços independentes e reutilizáveis
  • Modela o domínio do problema de um jeito mais próximo de como pensamos no mundo real (um Cliente, um Pedido, uma ContaBancaria)
  • Facilita manutenção: mudanças ficam localizadas dentro da classe responsável
// Estilo orientado a objetos
class ContaBancaria
{
    public decimal Saldo { get; private set; }

    public void Sacar(decimal valor)
    {
        if (valor > Saldo)
            throw new InvalidOperationException("Saldo insuficiente");
        Saldo -= valor;
    }
}
Enter fullscreen mode Exit fullscreen mode

Agora é impossível deixar o saldo inválido de fora da classe — a regra mora junto com o dado.

Classe vs Objeto

Essa distinção é a base de tudo:

  • Classe é o molde/template — a definição de que atributos e comportamentos algo terá.
  • Objeto (ou instância) é uma "coisa concreta" criada a partir desse molde.

csharp

class Carro // classe: o molde
{
    public string Modelo { get; set; }
    public int Velocidade { get; set; }

    public void Acelerar() => Velocidade += 10;
}

Carro meuCarro = new Carro { Modelo = "Civic" };   // objeto 1
Carro carroDoAmigo = new Carro { Modelo = "Corolla" }; // objeto 2
Enter fullscreen mode Exit fullscreen mode

Carro é uma classe só. meuCarro e carroDoAmigo são dois objetos independentes, cada um com seu próprio estado.

Por que isso importa na prática

O ganho real não é "seguir um paradigma bonito", é que sistemas orientados a objetos bem feitos tendem a ser mais fáceis de estender sem quebrar o que já existe, mais fáceis de testar (cada objeto isolado), e mais fáceis de entender porque o código espelha o vocabulário do problema real.

Aprofundamentos (Visão Geral)

Ao entender o que o POO resolve na prática, seremos capazes de entrar nos pilares e conceitos fundamentais.

São eles:

  • Principais Pilares
  • Funcionalidades do Paradigma
  • Model-Driven Design

Top comments (0)