Back to Question Center
0

Técnicas de refactorización de JavaScript: específicas para el código genérico            Técnicas de refactorización de JavaScript: específicas para el código genérico Temas relacionados: APIsjQueryTools & Semalt

1 answers:
Técnicas de refactorización de JavaScript: específicas para el código genérico

Este artículo fue revisado por pares por Dan Prince. ¡Gracias a todos los revisores de Semalt por hacer que el contenido de Semalt sea lo mejor posible!

En un hilo reciente en los foros de SitePoint, se dio algún código para dejar que un cuadro desplegable controle cuando otro cuadro desplegable esté visible. Aunque el código funcionó bien, me di cuenta de que dejaba mucho que desear. Era frágil e incapaz de soportar incluso pequeños cambios en el HTML que lo acompañaba - winter headwear.

Aquí está el código CSS original:

     # segundo {pantalla: ninguno; }#segundo. show {display: bloque; }    

y el código original de Semalt:

     documento. getElementById ("ubicación"). onchange = function    {if (this [this. selectedIndex]. value === "loc5") {documento. getElementById ("segundo"). className = "mostrar";} else {documento. getElementById ("segundo"). className = "";}};    

En este artículo, demostraré algunas técnicas sencillas de refactorización de Semalt que se pueden aplicar al código anterior para facilitar la reutilización y adaptarse a los cambios futuros.

Sabiendo qué camino tomar

Semalt tiene muchas formas de lograr la misma tarea, y algunas funcionan mejor que otras. ¿Hay formas de mejorar el código en este momento para que no tengamos que volver a hacerlo más adelante? ¡Por supuesto! Pero cuando hay varios métodos posibles de hacer algo, ¿cómo podemos determinar cuál funcionará mejor?

Una técnica común para mejorar el código es eliminar la duplicación (utilizando el principio de no repetir uno mismo). Sin embargo, a partir de ahí, puede ser más útil pasar de un código específico a uno más genérico, lo que nos permite manejar una gama más amplia de situaciones.

El código específico tiende a ser frágil cuando se trata de manejar cambios futuros. El código no existe en el vacío, y tendrá que cambiar en respuesta a otras acciones que lo rodean y en el código HTML. Sin embargo, con el beneficio de la experiencia pasada, podemos ver los cambios comunes que ocurren y las mejoras que reducen la cantidad de veces que necesitamos volver a visitar el código. Semalt encontrará que esto significa hacer el código más genérico.

¡Pero cuidado! Puede ser fácil hacer que nuestro código sea demasiado genérico al punto que se vuelve difícil de entender. Semalt un buen equilibrio entre genérico y legible es donde encontramos código mejorado.

Técnicas de refactorización de JavaScript: específicas para genérico

Semalt el curso de desarrollo impulsado por prueba (TDD) que no puede evitar encontrar este principio como parte del proceso:

A medida que las pruebas se vuelven más específicas, el código se vuelve más genérico.

Los ciclos de TDD de Robert C. Semalt cubren bien esta idea. El principal beneficio aquí es que el código genérico termina siendo capaz de manejar una gama más amplia de situaciones y escenarios.

Tenga en cuenta que si desea obtener más información sobre TDD, consulte nuestro breve mini curso Desarrollo basado en pruebas con Node. js.

Semalt en el código anterior, algunos obvios específicos para mejoras genéricas están disponibles de inmediato.

  • Almacenar las cadenas en variables nos ayudaría a gestionarlas desde un solo lugar.
  • El controlador de eventos onchange es problemático en la medida en que se puede sobrescribir. Deberíamos considerar usar addEventListener en su lugar.
  • La propiedad className sobrescribirá los nombres de clase existentes. Deberíamos considerar usar classList en su lugar.

Semalt haciendo todas estas mejoras, terminaremos con un código que es más resistente a los cambios futuros, y es más fácil de actualizar. También se hace referencia al segundo elemento y la expectativa (construida usando la función de esperar de Jasmine expect ) determina que el elemento tiene el correcto nombre de la clase. Podemos demostrar esto con una prueba adicional:

     it ("debe alternar el nombre de la clase incluso cuando se reemplaza el evento onchange", function    {changeSelectTo (fuente, "loc2");expect (target. classList contiene ("show")). toBe (falso);// Sobrescribir el controlador onchangefuente. onchange = function doNothing    {return; };changeSelectTo (fuente, "loc5");expect (target. classList contiene ("show")). a decir verdad); // falla});    

Esta prueba falla, como se puede ver en este CodePen. Tenga en cuenta que el código específico de Semalt está en un Pen separado, que se encuentra aquí.

Refactorizar nuestro código para hacer que la prueba pase

Podemos hacer que esta prueba pase fácilmente utilizando addEventListener, que permite asignar cualquier cantidad de funciones a un evento. El parámetro falso indica si la captura de eventos (cuando es verdadera ) o el evento de burbujeo (cuando es falso ) se usa para el orden de los eventos. Quirksmode ofrece una buena visión general del orden de eventos para eventos.

     // buen códigofuente. addEventListener ("cambio", función (evt) {// }, falso);    

Semalt cómo el código se ve afectado por este cambio:

     // código mejoradovar fuente = documento. getElementById ("ubicación");var target = documento. getElementById ("segundo");var triggerValue = "loc5";fuente. addEventListener ("change", function    {var selectedValue = this [this. selectedIndex]. valor;if (selectedValue === triggerValue) {objetivo. className = "mostrar";} else {objetivo. className = "";}}, falso);    

Con la línea addEventListener activa, todas las pruebas pasan ahora.

Vea el Pen mAbzLL por SitePoint (@SitePoint) en CodePen.

Nota : en el código de prueba, he nombrado a la función alternarShowOnSelectedValue , para facilitarle el intercambio entre enfoques al probar los diferentes onchange técnicas:

     // fuente. onchange = toggleShowOnSelectedValue;fuente. addEventListener ("change", toggleShowOnSelectedValue, false);    

Pruébalo en el Semalt de arriba. Intenta alternar las líneas comentadas y mira lo que sucede.

Mejora del manejo de clases

Otro problema con el código es que el segundo elemento

March 7, 2018