Este é o quarto artigo da série Princípios SOLID – Boas práticas de programação com C#. Nele falaremos da quarta letra do acrônimo do SOLID: ISP: Interface Segregation Principle. Você pode ler o artigo anterior clicando aqui.
Princípio da Segregação de Interface: Classes não devem ser forçadas a depender de métodos que não usam.
Para evidenciar melhor o cenário, suponhamos que exista o domínio de produtos e clientes e que é necessário implementar o cadastro de ambos, e pensando em “simplificar” poderíamos ter a seguinte abstração:
public interface ICadastro { void ValidarDados(); void SalvarBanco(); void EnviarEmail(); }
E as respectivas classes implementando-as:
public class CadastroCliente : ICadastro { public void ValidarDados() { // Validar CPF, Email } public void SalvarBanco() { // Insert na tabela Cliente } public void EnviarEmail() { // Enviar e-mail para o cliente } }
public class CadastroProduto : ICadastro { public void ValidarDados() { // Validar valor } public void SalvarBanco() { // Insert tabela Produto } public void EnviarEmail() { // Produto não tem e-mail, o que eu faço agora??? throw new NotImplementedException("Esse metodo não serve pra nada"); } }
Qual o problema aqui? O domínio de produto não sabe nada sobre envio de email, portanto, temos um erro de abstração.
Avaliando melhor o cenário percebe-se a necessidade em desacoplar os dois cadastros, já que são regras diferentes.
Como solução poderíamos ter uma interface para cada contexto separado:
public interface ICadastro { void SalvarBanco(); }
public interface ICadastroCliente : ICadastro { void ValidarDados(); void EnviarEmail(); }
public interface ICadastroProduto : ICadastro { void ValidarDados(); }
Assim, cada implementação teria apenas a parte que realmente lhe cabe:
public class CadastroCliente : ICadastroCliente { public void ValidarDados() { // Validar CPF, Email } public void SalvarBanco() { // Insert na tabela Cliente } public void EnviarEmail() { // Enviar e-mail para o cliente } }
public class CadastroProduto : ICadastroProduto { public void ValidarDados() { // Validar valor } public void SalvarBanco() { // Insert tabela Produto } }
A dica aqui é:
- Trabalhe orientado à interfaces. Os contratos pré definidos permitirão que as classes dependentes tenham a implementação somente dos métodos que fazem sentido no contexto.
No próximo artigo vamos falar sobre o Princípio da Inversão de Dependência (DIP) e entender melhor porque inverter o controle e depender de abstrações ao invés de implementação, deixa o código mais desacoplado.
Referências
C# – Princípio Da Segregação da Interface(ISP)
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.