Creators
7
min de leitura
18 de março de 2021

Você sabe o que é Bad Smell ? Parte III

Thiago dos Santos Chagas
.Net Consultor
Desenvolvo e implemento vários testes para aplicação em software . Eu avalio projetos e asseguro compliance com requisitos comerciais na plataforma de API da Sensedia.
Mais sobre o autor

Para finalizar a sequência de artigos sobre Bad Smell aqui no blog da Sensedia, falaremos um pouco sobre família Object Orientation Abusers, mais especificamente sobre “Refused Bequests e Alternative Classes With Different Interfaces", e você pode conferir a parte 1 e 2 deste conteúdo aqui em nosso acervo.

Refused Bequests

O bad smell Refused Bequest está relacionado ao uso de herança e pode ser visto em classes derivadas que não usam a maioria das funcionalidades da classe Pai. Mesmo tendo essa herança, a classe pai e a classe derivada não são nada parecidas. Isto nos traz um grande problema pois viola o Princípio da Substituição de Liskov.

Vamos ver um exemplo para que fique mais fácil o entendimento:

Refused Bequests

Classe Pai

Classe Pai

Classe derivada

As classes acima mostram um exemplo clássico de Refused Bequest. A classe derivada ignora a funcionalidade da classe Pai (no momento em que se recusa a usar o comportamento do pai fazendo o “override” dos métodos). Esta atitude, também viola o Princípio da Substituição de Liskov, já que a classe derivada substitui o comportamento da classe pai afetando a sua funcionalidade.

E como fazemos para resolver este problema?

Classe derivada

Classe Pai Resolved

Classe Pai Resolved

Classe Derivada Resolved

Em alguns cenários ,sabemos que a herança faz sentido para a extensão e em outros casos não. Voltamos na implementação da classe pai e usamos a técnica de refatoração chamada Push Down Method, onde retiramos da classe pai os métodos sobrescritos pela classe derivada, fazendo também a alteração do seu nome para algo mais significativo dentro do seu contexto, deixando apenas o que faz sentido para a classe base tendo a certeza de que não precisarão ser sobrepostos.

Alternative Classes with Different Interface

Este bad smell está relacionado a situação em que duas classes diferentes parecem conter responsabilidades similares mas contém diferentes interfaces, ou nomes de métodos ou propriedades.Geralmente, isso acontece por falta de comunicação entre os membros da equipe que acabam não verificando se já existe algo construído para aquela finalidade.

Alternative Classes with Different Interface

Classe Conversor

Classe Conversor

Classe ConversorDePreco

Nas imagens acima temos duas classes : Conversor e ConversorDePrecos. Ambas têm implementações quase idênticas para efetuar a conversão de um valor dado de acordo com o tipo da moeda. Este código mostra total descaso com princípio DRY onde o código foi duplicado mas com uma pequena variação.

E como fazemos para resolver este problema?

Classe ConversorDePreco

Dependendo de como o problema é apresentado, (caso as classes tenham comportamentos iguais implementando interfaces diferentes), uma solução seria a criação de uma classe abstrata (base) ou uma única interface deixando as classes estenderem ou implementarem da forma necessária. A única coisa que não poderíamos ter seriam duas implementações de mesmo tipo na mesma interface pois não faria nenhum sentido. O ideal seria excluir uma das implementações e seguir com a outra.

No caso das classes Conversor e ConversorDePrecos ,não vamos resolver usando classes abstratas ou interfaces. Vamos apenas considerar o Princípio da responsabilidade única, vamos deixar a implementação dedicada a classe Conversor e remover o método da classe ConversorDePrecos substituindo o método com a única implementação restante. Esta implementação nos traz os benefícios de existir apenas um local para uma eventual alteração (Single point of change) e está totalmente de acordo com o DRY.

Se interessou sobre o assunto? Este conteúdo foi produzido pelo nosso .Net Developer, Thiago Chagas e você pode conferir detalhes mais técnicos acessando a série de conteúdos:“Você sabe o que é Bad Smell? Nunca vi nem comi eu só ouço falar !!”.

May the force be with you!


Obrigado pela leitura!