DEV Community

Cover image for PRINCÍPIO DE ABERTO/FECHADO
Victor Lis Bronzo
Victor Lis Bronzo

Posted on

PRINCÍPIO DE ABERTO/FECHADO

OPEN - CLOSED PRINCIPLE

As partes integrantes de um código devem ser abertas para extensão e fechadas para modificações.

A ideia é evitar a dependência de verificações condicionais com if-else, operadores ternários e switch.

Quando um novo requisito chegar, você adiciona o comportamento criando algo novo, sem modificar o código antigo.


PRA SER JUSTO

A ideia de não usar operadores condicionais é um resultado de uma aplicação correta do OCP, não é o foco em si.

Isso porque para conseguir não depender desses operadores é necessário excelência na aplicação de polimorfismo e abstração.

Com isso, se torna possível acoplar novas implementações sem reescrever o código já existente.


EXEMPLO RUIM

Todo novo meio de pagamento causará uma edição aqui. Dificulta em novas implementações e põe em risco as antigas.

Exemplo de Código:

// RUIM: Forte acoplamento. A classe precisa ser modificada a cada nova regra.
class PaymentProcessor {
  public process(amount: number, method: 'CREDIT_CARD' | 'PIX' | 'PAYPAL'): void {
    if (method === 'CREDIT_CARD') {
      console.log(`Processando R$${amount} via Cartão de Crédito...`);
      // Lógica complexa de integração com a adquirente...
    }
    else if (method === 'PIX') {
      console.log(`Processando R$${amount} via chave Pix...`);
      // Lógica complexa de geração de QRCode...
    }
    else if (method === 'PAYPAL') {
      console.log(`Processando R$${amount} via PayPal...`);
      // Lógica complexa de redirecionamento...
    }
    else {
      throw new Error('Método de pagamento não suportado.');
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

EXEMPLO BOM

Basta cumprir o contrato “IPaymentMethod” e o método já é válido.

Conseguimos então adicionar um “DebitCardPayment”, sem afetar os demais métodos.

Exemplo de Código:

// 1. A Abstração (O Contrato)
interface IPaymentMethod {
  processPayment(amount: number): void;
}

// 2. As Extensões (Novos comportamentos isolados)
class CreditCardPayment implements IPaymentMethod {
  public processPayment(amount: number): void {
    console.log(`Processando R$${amount} via Cartão de Crédito...`);
  }
}

class PixPayment implements IPaymentMethod {
  public processPayment(amount: number): void {
    console.log(`Processando R$${amount} via chave Pix...`);
  }
}

// 3. A Aplicação Fechada (O Consumidor)
class PaymentProcessor {
  public process(amount: number, paymentMethod: IPaymentMethod): void {
    paymentMethod.processPayment(amount);
  }
}

// Uso prático:
const processor = new PaymentProcessor();
processor.process(150.0, new PixPayment());
Enter fullscreen mode Exit fullscreen mode

É MESMO TÃO IMPORTANTE?

Sem titubear, sim e muito!

Retrabalho é caro: é mão de obra, planejamento e tempo desperdiçados.

E além disso, ficar constantemente alterando código já “finalizado” abre mais brechas para quebrar uma regra de negócio ou feature que já funcionava.


Meus Links
Github: victor-lis-bronzo
Linkedin: victor-lis-bronzo
Portfólio: portfolio.victorlisbronzo.me
Portfólio mais legal: victorlisbronzo.me


Deixe sua reação ❤️
Você já precisou refatorar código antigo por ter aplicado mal o OCP?

Top comments (0)