DEV Community

Cover image for POO Além do Código #1: Abstração (O Arquiteto de Soluções)
Bruno S Freschi
Bruno S Freschi

Posted on

POO Além do Código #1: Abstração (O Arquiteto de Soluções)

Você já sentiu que seu código está virando um "emaranhado" de funções, mesmo usando classes? Muitas vezes, o problema não é a linguagem ou o framework, mas a falta de um conceito fundamental que separa os digitadores de código dos arquitetos de software: a Abstração.

Neste primeiro artigo da série sobre os pilares da POO, vamos descer um nível e entender por que a abstração é a alma de sistemas escaláveis.


🧐 O que é Abstração, afinal?

Abstrair não é "esconder código". Abstrair é a arte de ignorar o que não importa em um determinado contexto.

Imagine um objeto Carro. Dependendo do sistema que você está construindo, a abstração dele muda completamente:

Contexto O que importa (Abstração) O que é irrelevante
GPS / Logística Latitude, Longitude, Velocidade Cor do estofado, Tipo de óleo
Oficina Mecânica Histórico de revisões, Peças, KM Destino da viagem atual
E-commerce Preço, Modelo, Ano, Estoque Pressão dos pneus

Regra de Ouro: Foque no O QUE o objeto faz, e não no COMO ele faz.


🎮 O Exemplo do Controle Remoto

Pense na interface de um controle remoto. Você tem botões para Ligar(), MudarCanal() e AjustarVolume().

Para você, não importa se a TV recebe o sinal via Infravermelho, Bluetooth ou Wi-Fi. A abstração (os botões) permanece a mesma, enquanto a implementação (a eletrônica interna) pode mudar completamente sem que você precise aprender a usar o controle de novo.


💻 Abstração na Prática (C#)

Quando trazemos isso para o código, estamos definindo contratos de comportamento. Veja este exemplo focado no domínio de pagamentos:

// Definimos o "Contrato": Todo meio de pagamento DEVE ser processado.
// O COMO (Pix, Cartão, Boleto) não nos interessa neste nível.

public abstract class MeioDePagamento
{
    public decimal Valor { get; set; }

    // O arquiteto define o comportamento, mas deixa a execução para o futuro.
    public abstract void Processar();
}
Enter fullscreen mode Exit fullscreen mode

Estou aplicando neste repo. alguns conceitos

BrunoSFreschi/Blueprint-OOP

Por que isso é poderoso?

Se amanhã surgir o "CryptoPay", você não precisa alterar a lógica principal do seu sistema. Você apenas cria uma nova classe que herda de MeioDePagamento e implementa o método Processar(). O restante do software continua conversando com a abstração.


🚨 O Erro Comum: O "Procedural Disfarçado"

No ecossistema .NET, é muito comum cairmos na armadilha das classes "Anêmicas" acompanhadas de gerenciadores:

  • UserService
  • UserHelper
  • UserManager

Se o seu objeto User só tem propriedades (get/set) e toda a lógica está em um "Helper", você não está fazendo Orientação a Objetos. Você está fazendo Programação Procedural dentro de classes.

A abstração real acontece quando o objeto possui comportamento e responsabilidades claras dentro do seu contexto.


🧠 Checkpoint Mental

Antes de criar sua próxima classe, faça estas quatro perguntas:

  1. 🏦 Domínio: Esta classe representa um objeto real do meu negócio?
  2. 🔍 Contexto: Estou colocando detalhes que não pertencem a este cenário?
  3. ⚙️ Tecnologia: Se eu trocar o banco de dados ou a UI, essa ideia ainda faz sentido?
  4. 🎭 Comportamento: Estou modelando ações ou apenas guardando dados (balde de variáveis)?

🛤️ Próximos Passos

A abstração é o alicerce. Sem ela, os outros pilares perdem o sentido. No próximo post, vamos falar sobre Encapsulamento: como proteger essa abstração e garantir que ninguém "mexa nos fios" por trás do controle remoto.

E você? Já pegou algum sistema onde a falta de abstração tornou uma mudança simples em um pesadelo de refatoração? Deixe nos comentários!

#dotnet #csharp #poo #architecture #programming


Top comments (0)