[S.O.L.I.D.] Os Cinco Pilares da Programação Orientada a Objetos. [O] - Open/Closed Principle - OCP
Tags: java, solidprinciples
Published: 2024-05-25 00:19:26

Continuando a série sobre SOLID, caso não tenha lido o artigo anterior: {% embed https://dev.to/dsb88/solid-os-cinco-pilares-da-programacao-orientada-a-objetos-para-desenvolvedores-2lph %}

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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n87azo4b3x8ap94t8s8v.png)

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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k77tggbsb0num6a4a9bb.png)

_Implementações de PaymentMethod_
**CreditCardPayment**
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b5y3bruwtu9v5bhhcnxl.png)

**PayPalPayment**
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/669uuwv2fmepumh80zxc.png)

**Classe PaymentProcessor com OCP**
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vgwkgh0v6gwd5gvomxe7.png)

**Uso das Classes**
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xuqwvn3pobhns15xh7dy.png)

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:_
{% embed https://dev.to/dsb88/solid-os-cinco-pilares-da-programacao-orientada-a-objetos-l-liskov-substitution-principle-lsp-5ebg %}