Mi consejo es general y no necesariamente se aplicará a JavaScript.
Dada una función y solo su salida, puede ser increíblemente difícil descubrir qué entrada la causó, especialmente para una salida inesperada.
Si comprende el entorno operativo y tiene acceso privilegiado, a veces puede examinar la memoria en la pila de llamadas (en binario) después de una llamada a la función. Para valores no sobrescritos, puede ver lo que estaban en la llamada de función, posiblemente revelando todos los parámetros.
De manera más realista, suponga que solo tiene una tabla de resultados y desea saber qué entrada los produjo. Las dificultades incluyen:
- Dirijo 2 tiendas de reparación, ¿debo cobrar a las personas una pequeña tarifa por usar tarjetas de débito o crédito para el pago?
- Quiero entrar en medicina veterinaria. ¿Qué se ve bien en una aplicación universal para este curso?
- Si me colocan en un plan de mejora del rendimiento (PIP), ¿debería dejarlo ahora?
- Me intriga el tejido: la idea de hacer telas como lo hicieron hace mucho tiempo. ¿Alguien puede sugerir cómo podría probar esto y ver si es una habilidad que debería aprender?
- He probado Johnny Walker, Pinch y Swing. ¿Cuáles son los mejores whiskies mezclados?
- Mapeo de muchos a uno . Una sola salida puede ser el resultado de muchas entradas diferentes. Por ejemplo, si la función es SquareOf (x) y la salida es 9, ¿cómo saber si era una entrada +3 o -3 para x? Ambos resultan en 9.
- Cambio en no parámetros . Tal vez la función utiliza variables externas que tienen valores diferentes en diferentes momentos. Tal vez está usando una variable no inicializada cuyo valor depende de lo que sucedió antes de esta llamada. Tal vez hay una función incluida en función de la hora actual, la dirección IP, quién sabe qué. A menos que conozca estos valores que no son parámetros a priori, no puede controlarlos ni identificarlos.
- Comportamiento inesperado No solo está tratando de encontrar las entradas que producen un resultado esperado, sino uno aberrante. Dada nuestra función SquareOf (), imagine si algún valor devuelve ‘-9’. ¿Cómo diablos puedes intuir qué parámetros probar?
Si realmente desea encontrar el problema, le recomiendo las siguientes opciones. Tenga en cuenta que estos se centran en encontrar el problema en lugar de solo encontrar las entradas.
- Registro Registre los parámetros de entrada junto con el parámetro de salida, para que no vuelva a tener este problema.
- Validación de parámetros . Basura dentro basura fuera. Agregue comprobaciones para asegurarse de que los valores de entrada estén en el rango que espera, por ejemplo, 0… 4,096 para las coordenadas de pantalla x e y.
- Memoria comprobada Obtenga una pila de memoria comprobada que controlará estrictamente el acceso a la memoria y ejecute su función en ella. Si se accede a una ubicación de memoria o variable de manera inesperada, arroja una excepción. Alimente una amplia variedad de entradas esperadas para la función y espere una excepción.
- Implementación paralela . Escriba una función similar desde cero y genere algún tipo de tabla o secuencia de entradas y salidas esperadas. Luego alimente las entradas de la tabla en las funciones reales y compárelas con la salida. Alternativamente, solo llame a ambas funciones en tiempo de ejecución y compare sus resultados.
- Parámetro de barrido exhaustivo . Recorre todas las combinaciones de valores de parámetros de entrada, haciendo una pausa cuando uno genera tu salida. Tenga en cuenta que es posible que la función nunca vuelva a generar esa salida si depende del valor de una variable no inicializada.
- Valores aleatorios Intente valores de entrada aleatorios para la función hasta que genere un valor de salida claramente fuera de rango, luego haga una pausa.
Problema difícil Cuando me enfrento a cosas como esta, trato de rastrearlas. Si todavía no puedo encontrarlo, guardo ese fragmento de código, lo reescribo desde cero y veo si el problema desaparece. Por lo general lo hace.