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.');
}
}
}
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());
É 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)