JavaScript: cómo refactorizar usando clases


En proyectos React pequeños, mantener todos los métodos de un componente en el propio componente es buena idea. En proyectos medianos, desearás poder sacar esos métodos del componente y meterlos en un ‘Utilidades’. Aquí veremos como usar una Clase (en lugar de exportar funciones y variables) para organizar el código.
Nota: este ejemplo se realizará con React.

Refactorización típica

En una refactorización típica, sacaríamos una función de un componente para llevarlo a un ‘Utils’
De:

A:

Refactorizando con una clase

He realizado una demostración para esta entrada. Puedes ver el código en GitHub. El commit inicial muestra toda la funcionalidad dentro del componente principal (App.js) y los siguientes commits refactorizan el código para usar una clase. Puedes ejecutarlo y probarlo tú mismo. Recuerda usar yarn install. Comenzamos con un componente que recupera un objeto (imitando el modo en el que lo haríamos desde una API) con varios atributos: repeat (número de cajas), side (altura y anchura), text y color. Después, tenemos varios modos de manipular la vista – cambiando el color, modificando el texo, etc. Después cada cambio, mostramos un mensaje. Por ejemplo, este es nuestro método para cambiar altura y anchura:

Podemos tener varios métodos que requieren acciones similares, o tal vez métodos muy diferentes. Podemos empezar a pensar en sacarlos a un archivo. Entonces crearíamos un método diferente para llamar a la acción setState y tendríamos que pasárselo, this.fetchObject, el objeto en el estado, y el sideque obtenemos como parámetro del método. Si tenemos varios métodos similares, son muchos parámetros a pasar y ya no es tan útiil (ni legible).
En su lugar podemos usar una clase, con su propio constructor:

Esto nos permite crear un objeto cuyas funciones podemos llamar dentro de nuestro componente principal.

Esto crea un objeto manipulator, una instancia de nuestra clase ObjectManipulator. Cuando llamamos a manipulator.changeSide(object, '800') ejecutará el método changeSide definido arriba. No es necesario pasar updateMessage o cualquier otro método, lo llamamos desde el constructor, cuando hemos creado la instancia.
Como puedes imaginar, esto es muy útil si tenemos gran cantidad de estos métodos. En mi caso, debo llamar a then(res => myFunction(res) después de todo lo que he intentado extraer. Definir myFunction en la instancia en lugar de pasarla a cada función me ha ahorrado mucho código.

Manteniéndolo todo organizado

Este método de organización puede ser muy útil para mantenerlo todo en su lugar. Por ejemplo, tengo un array de colores que mapeamos para obtener los botones de colores que vemos en el ejemplo. Moviendo esta constante a ObjectManipulator nos aseguramos que no ‘chocan’ con otros colors de mi aplicación:

Podemos usar manipulator.colors para recoger los colores correctos para cada página, y puede coexistir con una variable global colors que usamos para cualquier otra funcionalidad.

Referencias

Good old Mozilla Class docs (en inglés)

 

Nota: puedes encontrar el artículo original en https://medium.freecodecamp.org/javascript-code-cleanup-how-you-can-refactor-to-use-classes-3948118e4468

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *