Un ejemplo del uso de la coerción y ES6.
Tags: javascript, beginners, webdev, programming
Published: 2022-01-06 14:53:42

_Coerción de manera simple : Es la acción de forzar a que un objeto se comporte como si fuera de otro tipo [[ref](https://mauriciogc.medium.com/javascript-ecuaciones-complejas-440578bcfad7)]._
 
Hace unos días estaba viendo un curso de React en alguna plataforma de educación online, me percate que tenían una validación del siguiente tipo.

{% replit @ghgaby/validation %}

A pesar de que es funcional y correcto, no me dejó muy conforme, ya que actualmente realizo test unitarios con Mocha & Chai y una de las premisas de los test unitarios es la validación de todos los casos de la porción de código a testear.

¿Te imaginas cuantos casos existen en la validación del if de la línea 17? Te cuento:

1.  El primero es cuando todos los x.y.trim() === ‘’ son falsos.
2.     Cuando todos los x.y.trim() === ‘’ son verdaderos.
3.     Cuando tiene algún verdadero (en este caso son 5 validaciones, una por posición).

Son aproximadamente 7 casos 🤯 tomando en cuenta aquellas validaciones necesarias de acuerdo al operador lógico, bueno y entonces la pregunta es ¿Para que tantas validaciones? la respuesta es: para que el UT cubra todos los casos (o por lo menos la mayoría) y alcances la cobertura necesaria. Por otro lado, sí ya lo has notado, los únicos valores que te podría retornar esa función es true o false… Muchos casos para el valor a retornar ¿No crees?.

¡Manos a la obra pues! podrías implementar una función más “corta” en la que se omitan los operadores lógicos y en dónde sólo tendrías que hacer test para dos casos, sí te retorna un true o false.

La otra característica es que sería una función más reutilizable ahora funcionaría con objetos con otras keys, diferente número de keys. Todo esto gracias a la coerción y ES6.

{% replit @ghgaby/validation-coercion %}

Te explico, la función hace uso de every en términos generales determina sí todos los elementos en el array satisfacen una condición [[ref](https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/Array/every)].

¡What! un array, pero si veo un objeto… Sí, es un objeto pero Object.keys es un método usado para retornar las propiedades enumerables [[ref](https://www.todojs.com/propiedades-enumerables-no-enumerables/)] y entonces obtenemos un array con el nombre de las keys.

Luego creamos una arrow function cuyo único trabajo es validar la propiedad del objeto, mediante el nombre que se le pasa en los parametros, aquí es donde entra en acción la coerción, como trim retorna un string sin espacios, se puede decir que la función searchEmpty retornaría dos valores un string o vació, un string por coerción [[ref](https://medium.com/@mauriciogc/javascript-ecuaciones-complejas-440578bcfad7)] sería un true en cambio un vació sería false, evitando los operadores lógicos.

Para el test unitario sólo tendrías que validar dos casos, cuando sea true o false, sin depender de los valores exactos del objeto, sin “casarlo” con un único objeto o similar, tendrás un código más limpio y más reutilizable.

Como este caso hay muchos más que pueden ser reducidos gracias a la coerción de Javascript, te dejo un artículo para saber más acerca de esta característica tan cool de JS y que deja a muchos developers con cara de ¡what! [[ref](https://mauriciogc.medium.com/javascript-ecuaciones-complejas-440578bcfad7)].

_Gracias por llegar hasta aquí, agradezco los comentarios, quejas, sugerencias… Hagan código, pero código bonito._