Eliminación del "Switch Smell":

Posted by Nitesh Gul Ramnani on March 12th, 2016

Fourth project (Eliminación del Switch Smell):

Eliminación del Switch Smell


Requirements:

En la práctica anterior modificamos el código del conversor de temperaturas para que usara objetos y herencia.

En dicha práctica definimos las clases Medida, Temperatura(que hereda de Medida) así como las clases Celsius, Fahrenheit, Kelvin, etc. que heredan de Temperatura.

En la solución que aportó en la práctica de iniciación a la OOP en JavaScript posiblemente usaba bien un switch, bien un if elsepara a partir de la entrada determinar el tipo de conversión necesaria: ¿Que clase usar? Celsius o Kelvin? y también para determinar ¿Que método usar toFahrenheit o toCelsius?.

Es mejor que la función convertir reciba un parámetro de entrada y retorne el resultado y no dependa de elementos externos como el DOM de manera que se pueda aislar en una librería

La expresión regular se computa cada vez que se llama a convertir. Esto conlleva un tiempo de cómputo innecesario ya que la expresión regular es una constante que puede sacarse fuera de convertir

Es mejor tener aisladas las clases en distintos ficheros. Una posible solución es tener un fichero para Medida otro para Temperatura (en el que guardar todas las clases Temperatura) y quizá otro para el programa principal (main).

Ahora convertires una función global, un método del objeto window. Es mejor encapsularlo algo mas y que sea un método de clase de la clase Medida.

Como señalamos en la sección Code Smells el uso de un switch con dependencia de las clases es siempre un punto débil: si introducimos nuevas clases, por ejemplo, Rankine deberemos modificar además del código de las clases Temperature el código de conversión introduciendo un nuevo case. Viola el principio Open/Closed.

Aunque no aparece en el código anterior, la expresión regular usada en el código original también presenta varias debilidades.

Una de ellas es que es que no escala si se introducen nuevas clases. La clase usada [fck] impide que, por ejemplo, en el futuro, una r para Rankine sea aceptada.

Otra es que la expresión regular se construye dentro del código de la función convertir. cada vez que convertires llamada la XRegExp es compilada. Podemos convertirla en una constante de la clase y compilarla una sola vez evitando así un coste innecesario de re-computo

El uso excesivo de constantes de tipo String como 'k', 'c', etc. Corremos el riesgo de escribirlas de forma inconsistente en algún momento.

De hecho, en el diseño de algunas prácticas de los alumnos he podido ver que métodos como toCelsius o toKelvin devuelven un Stringcon la conversión. Sería mas consistente que toCelsiusdevolviera un objeto de la clase Celsiusy toKelvinuno de la clase Kelvin