DEV Community

Cover image for [S.O.L.I.D.] Os Cinco Pilares da Programação Orientada a Objetos. [O] - Open/Closed Principle - OCP
Diego de Sousa Brandão
Diego de Sousa Brandão

Posted on

[S.O.L.I.D.] Os Cinco Pilares da Programação Orientada a Objetos. [O] - Open/Closed Principle - OCP

Continuando a série sobre SOLID, caso não tenha lido o artigo anterior:

Neste artigo estarei falando sobre o segundo princípio que é:

Open/Closed Principle
Princípio Aberto/Fechado - OCP
“Aberto para extensão e Fechado para
modificação.”

Definição: Entidades de software (classes, módulos, funções, etc.) devem estar abertas para extensão, mas fechadas para modificação. Isso significa que você deve ser capaz de adicionar novas funcionalidades sem alterar o código existente.

Exemplo: Sistema de Processamento de Pagamentos
Vamos criar um sistema de processamento de pagamentos. Inicialmente, temos suporte apenas para pagamentos com cartão de crédito, mas posteriormente desejamos adicionar suporte para pagamentos via PayPal. Vamos ver como implementar isso sem e com o OCP.

Sem OCP
Classe PaymentProcessor sem OCP

Image description

Aqui, a classe PaymentProcessor não segue o OCP. Se precisarmos adicionar um novo método de pagamento (por exemplo, Bitcoin), teremos que modificar essa classe, o que pode introduzir bugs e torna a manutenção mais difícil.

Com OCP
Interface PaymentMethod
Image description

Implementações de PaymentMethod
CreditCardPayment
Image description

PayPalPayment
Image description

Classe PaymentProcessor com OCP
Image description

Uso das Classes
Image description

Explicação:

  • Interface PaymentMethod: Define o contrato para qualquer método de pagamento. Qualquer nova forma de pagamento precisa implementar essa interface.
  • Implementações de PaymentMethod: Cada classe concreta (CreditCardPayment, PayPalPayment) implementa a interface PaymentMethod e define a lógica específica de processamento.
  • Classe PaymentProcessor: Em vez de usar condicionais (if ou switch) para verificar o tipo de pagamento, usamos um map para associar strings a implementações de PaymentMethod. Isso permite registrar novos métodos de pagamento dinamicamente.
  • Uso das Classes: Demonstramos como registrar e usar diferentes métodos de pagamento. Também mostramos como adicionar um novo método de pagamento (Bitcoin) sem modificar as classes existentes, apenas adicionando uma nova implementação de PaymentMethod.

Ao seguir o Princípio Aberto/Fechado, podemos adicionar novas funcionalidades de maneira segura e sem modificar o código existente, o que facilita a manutenção e a evolução do sistema.

PS: Para ir direto para o próximo princípio:

Top comments (0)