Advertencias » Histórico » Versión 3
Federico Vera, 2018-08-05 03:32
1 | 1 | Federico Vera | # Advertencias |
---|---|---|---|
2 | |||
3 | {{>toc}} |
||
4 | |||
5 | # Encontrando errores |
||
6 | 2 | Federico Vera | |
7 | ## Concatenar operadores de comparación |
||
8 | |||
9 | Este es un error **_muy común_** y brutal. |
||
10 | Imagine la siguiente ecuación: `a < b < c`, ahora hagamos `a = 1`, `b = 3` y `c = 2` lo que se traduciría en `1 < 3 < 2`. Para aquellos no familiarizados en la evaluación de operadores pueden llegar a pensar que el resultado es `falso` (`0.0`) pero en realidad es `verdadero` (`1.0`). ¿Por qué? bueno: |
||
11 | ``` |
||
12 | a < b < c -> ((a < b) < c) |
||
13 | ``` |
||
14 | Por lo tanto el ejemplo se convierte en: |
||
15 | ``` |
||
16 | 1 < 3 < 2 -> ((1 < 3) < 2) -> ((1) < 2) -> 1 |
||
17 | ``` |
||
18 | Moraleja: **Si no está seguro, NO CONCATENE OPERADORES** |
||
19 | |||
20 | 1 | Federico Vera | # Nombres de Variables |
21 | Deben evitarse nombres de variables y funciones que tengan el mismo nombre que las funciones, constantes u operadores. En la versión actual de `exp4j` esto está permitido (va a cambiar en el futuro). |
||
22 | |||
23 | ¿Por qué es malo? bueno... si tenemos una función incorporada llamada `sin(x)` y creamos una segunda función llamada `sin(x, y)` y además utilizamos una variable llamada `sin` pueden generarse expresiones como: `sin(sin(sin, sin(sin)) + sin)` puede parecer tonto, pero lamentablemente es algo bastante más común de lo que parece. |
||
24 | |||
25 | # Rendimiento |
||
26 | |||
27 | 3 | Federico Vera | ## ~~Múltiples llamadas a `Expression#evaluate()`~~ |
28 | 1 | Federico Vera | Este es un error muy común. Los valores devueltos por `Expression#evaluate()` no se cachean, por lo tanto cada llamado reevalúa la expresión completa. Hay dos opciones: |
29 | 1. Guardar el valores de `Expression#evaluate()` en lugar de llamar a la función una y otra vez. |
||
30 | 1. ¡Implementar un cache de resultados! Ver #752 para más detalles |
||
31 | |||
32 | ## Activar el simplificador para una única evaluación |
||
33 | |||
34 | El simplificador tiene que hacer una ejecución completa para poder realizar su trabajo, por lo tanto no debe utilizarse para una sola evaluación dado que esto crearía una pérdida del 100% en el rendimiento (la expresión debe evaluarse dos veces). |
||
35 | ## Escribir expresiones simplificables |
||
36 | |||
37 | Por ejemplo la expresión `2 + 3x - 1` no es simplificable, porque el `Simplificador` no altera el orden de los operandos (Como los operadores pueden ser sobrecargados no hay una forma fácil de hacer esto). |
||
38 | Si en cambio se cambia `2 + 3x - 1` a `2 - 1 + 3x` será simplificado a `1 + 3x`. |