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ípios SOLID - Boas Práticas de Programação com C#: Parte 2: OCP – Open Closed Principle

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)

The Open Closed Principle

PIRES, E. SOLID: Teoria e Prática

Padrões de Projeto

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.