Este é o segundo artigo da série Princípios SOLID – Boas práticas de programação com C#. Nele falaremos da segunda letra do acrônimo do SOLID: OCP – Open Closed Principle. Você pode ler o artigo anterior clicando aqui.
Princípio do Aberto e Fechado: Classes devem estar abertas para extensão, mas fechadas para modificação.
Observe o seguinte trecho de código:
public class CalculoAumentoSalario { public void RealizarCalculoAumentoSalario(Funcionario funcionario, double aumento) { if (funcionario.Cargo == TipoCargo.Junior) { // Calcula valor do salário para cargo Junior } if (funcionario.Cargo == TipoCargo.Pleno) { // Calcula valor do salario para cargo Pleno } if (funcionario.Cargo == TipoCargo.Senior) { // Calcula valor do salário para cargo Senior } } } public enum TipoCargo { Junior, Pleno, Senior, Arquiteto }
O que acontece se amanhã vierem a existir mais variações de cargos neste cenário? Como especialista, Gerente, Designer, Agilista? Acontece que essa classe irá crescer muito e como já vimos, cada classe precisa ter uma única responsabilidade (SRP).
O princípio do aberto e fechado existe exatamente para termos cuidado nesse tipo de cenário. Para que as novas alterações sejam apenas adicionadas, independentemente do código que já existe para solucionar o problema hoje.
Imagine um grande quebra-cabeças. É exatamente assim que deve funcionar. As novas peças são adicionadas (aberto para extensão), mas as peças que já existem hoje não sofrem alterações (fechado para alterações).
Como solução para o código acima poderíamos pensar em:
public interface IAumentoSalario { double CalcularAumentoSalario(Funcionario funcionario); }
public class SalarioJunior: IAumentoSalario { private double const PERCENTUAL_JUNIOR = 0.2; public double CalcularAumentoSalario(Funcionario funcionario) { //executa demais regras necessárias para cálculo do salário aqui return funcionario.Salario + funcionario.Salario * PERCENTUAL_JUNIOR; } }
public class SalarioPleno: IAumentoSalario { private double const PERCENTUAL_PLENO = 0.3; public double CalcularAumentoSalario(Funcionario funcionario) { //executa demais regras necessárias para cálculo do salário aqui return funcionario.Salario + funcionario.Salario * PERCENTUAL_JUNIOR; } }
A dica aqui é:
- Crie classes extensíveis
- Crie classes estáveis
- Reduza o acoplamento entre classes
- Utilize encapsulamento
- Diminua possíveis pontos de alteração quando uma regra de negócio for modificada
Os padrões de projeto que utilizam o OCP como diretriz são o Factory Method como criacional, o Adapter, Bridge e Composite como estrutural e o Observer, Strategy e Chain of Responsability como comportamental.
No próximo artigo vamos falar sobre como a descoberta de uma matemática chamada Barbara Liskov (LSP) contribuiu para implementar de forma correta os conceitos de herança da POO.
Referências
OOP – O principio Open-Closed (OCP)
PIRES, E. SOLID: Teoria e Prática
ANICHE, M. Orientação a Objetos e SOLID para ninjas. São Paulo – Casa do Código
Samyla Dutra
Mineira, atuo na área de desenvolvimento desde 2017 e sou graduada em Engenharia de Computação pelo CEFET-MG. Gosto de entender a profundidade do backend e como melhorar a escrita de código. E isso se torna melhor em equipe! Amo estar em contato com a natureza, trilhar montanhas, ler livros e cozinhar.