Creators
7
min de lectura
18 de marzo de 2021

¿Usted sabe qué es Bad Smell? Parte III

Thiago dos Santos Chagas
Consultor .Net
Desarrollo e implemento varias pruebas para la aplicación software . Evalúo los proyectos y me aseguro de que compliance cumpla con los requisitos del negocio en la plataforma API de sensedia.
Más sobre el autor

Para finalizar la secuencia de artículos sobre Bad Smell aquí en el blog de Sensedia, hablaremos un poco sobre familia Object Orientation Abusers, más específicamente sobre “Refused Bequests y Alternative Clases With Different Interfaces", y usted puede ver la parte 1 y 2 de este contenido aquí en nuestro acervo.

Refused Bequests

El bad smell Refused Bequest está relacionado al uso de herencia y puede ser visto en clases derivadas que no usan la mayoría de las funcionalidades de la clase Padre. Incluso teniendo esa herencia, la clase padre y la clase derivada no son nada parecidas. Esto nos trae un gran problema pues viola el Principio de la Sustitución de Liskov.

Vamos a ver un ejemplo para que sea más fácil el entendimiento:

Refused Bequests

Clase Padre

Clase Padre

Clase Derivada

Las clases anteriores muestran un ejemplo clásico de Refused Bequest. La clase derivada ignora la funcionalidad de la clase Padre (en el momento en que se niega a usar el comportamiento del padre haciendo el “override” de los métodos). Esta actitud, también viola el Principio de la Sustitución de Liskov, ya que la clase derivada sustituye el comportamiento de la clase padre afectando su funcionalidad.

¿Y cómo hacemos para resolver este problema?

Clase Derivada

Clase Padre Resolved

Clase Padre Resolved

Clase Derivada Resolved

En algunos escenarios, sabemos que la herencia tiene sentido para la extensión y en otros casos no. Volvemos a la implementación de la clase padre y usamos la técnica de refactoración llamada Push Down Method, donde retiramos de la clase padre los métodos sobrescritos por la clase derivada, haciendo también la modificación de su nombre para algo más significativo dentro de su contexto, dejando solamente lo que tiene sentido para la clase base teniendo la convicción de que no necesitarán ser superpuestos.

Alternative Clases with Different Interface

Este bad smell está relacionado a situación en que dos clases diferentes parecen contener responsabilidades similares, pero contienen diferentes interfaces, o nombres de métodos o propiedades. Generalmente, esto ocurre por falta de comunicación entre los miembros del equipo que acaban no verificando si ya existe algo construido para aquella finalidad.

Alternative Clases with Different Interface

Clase Conversor

Clase Conversor

Clase ConversorDePrecio

En las imágenes anteriores tenemos dos clases: Conversor y ConversorDePrecios. Ambas tienen implementaciones casi idénticas para efectuar la conversión de un valor dado de acuerdo con el tipo de la moneda. Este código muestra total descaso con principio DRY donde el código fue duplicado, pero con una pequeña variación.

¿Y cómo hacemos para resolver este problema?

Clase ConversorDePrecio

Dependiendo de cómo el problema es presentado, (en el caso que las clases tengan comportamientos iguales implementando interfaces diferentes), una solución sería la creación de una clase abstracta (base) o una única interfaz dejando a las clases extenderse o implementarse de la forma necesaria. Lo único que no podríamos tener serían dos implementaciones del mismo tipo en la misma interfaz pues no tendría ningún sentido. Lo ideal sería excluir una de las implementaciones y seguir con la otra.

En el caso de las clases Conversor y ConversorDePrecios, no vamos a resolver usando clases abstractas o interfaces. Vamos solamente a considerar el Principio de la responsabilidad única, vamos a dejar la implementación dedicada a la clase Conversor y retirar el método de la clase ConversorDePrecios sustituyendo el método con la única implementación restante. Esta implementación nos trae los beneficios de existir solamente un local para una eventual alteración (Single point of change) y está totalmente de acuerdo con el DRY.

¿Se interesó sobre el tema? Este contenido fue producido por nuestro .Net Developer, Thiago Chagas y usted puede ver detalles más técnicos entrando a la serie de contenidos: “¿Usted sabe qué es Bad Smell? ¡¡Nunca lo vi ni comí, solo oigo hablar!!”.

May the force be with you!


¡Gracias por leer!