Trabajo con Javascript (Typescript), más concretamente con React. Entonces, esta pregunta está escrita en Javascript, pero es más como una pregunta general.
Estoy tratando de refactorizar un código y extraer métodos estáticos . Una vez que extraigo el método, me encuentro comprobando si todos los argumentos recibidos son válidos. Esto se vuelve difícil de leer y, a veces, el propósito real de la función tiene solo unas pocas líneas.
Aquí hay un ejemplo de cómo terminaría escribiendo un método/función
const isGreaterThan = (value1, value2) => { if(typeof value1 !== 'number'){ console.error("Invalid argument. value1 must be a number"); return 0; } if(typeof value2 !== 'number'){ console.error("Invalid argument. value2 must be a number"); return 0; } return value1 > value2 } Ahora imagina si este método recibe un Array
const isGreaterThanAll = (values, value1) => { if(!values instanceof Array){ console.error("Invalid argument. values must be an Array"); return 0; } if(!values.every(value => typeof value === 'number')){ console.error("Invalid argument. elements of values must be numbers"); return 0; } if(typeof value1 !== 'number'){ console.error("Invalid argument. value2 should be type of number"); return 0; } return values.every(value => value1 > value); } Ahora imagine pasar un Object o una Array de Object . Dependiendo de la complejidad de los argumentos, esto se vuelve más difícil de seguir.
Algunas de mis preguntas son:
Una forma de hacerlo es crear una función recursiva como esta.
const isNumberOrArrayOfNumbers = (x) => { if (typeof x === 'number') { return true; } if ( Array.isArray(x) ) { return x.every(n => isNumberOrArrayOfNumbers(n)); } return false; }; const isGreaterThanAll = (values, value1) => { let valid = [values, value1].every(a => isNumberOrArrayOfNumbers(a)); if (!valid) { console.error('Invalid'); return Number.NaN; } return values.every(value => value1 > value); }; console.log( isGreaterThanAll([1,2,3,5,6,7],12) ); console.log( isGreaterThanAll([1,2,3,5,6,7],4) ); console.log( isGreaterThanAll([1,2,3,"r",5,6,7],12) );Si está dispuesto a cambiar la firma de la función, también puede refactorizarla haciéndola variable y usando operadores de descanso
Eso podría ser algo como esto:
const isGreaterThanAll = (n, ...m) => { let valid = [n, ...m].every(x => typeof x === 'number'); ... };