Alters

Tips & Tricks: "cval" en lenguajes dinámicos

Buenas!

¿Dos entradas tan seguidas? Sí... os explico.

No escribía porque estaba empeñado en seguir con las mates en las siguientes entradas, pero como no tengo tiempo para nada, pues he decidido seguir con otras cosillas mientras saco algo de tiempo para las mates (ya que para hacer entradas de matemáticas necesito estar en casa, en mi despacho, donde tengo todos los apuntes).

Así que iré alternando entradas "normales" con entradas de proyectos, ¿ok?

Hoy toca hablar de "cval".

¿Os interesa?

¡Vamos allá!



Seguramente el concepto "cval" no os suene ni a los más expertos. Pues es normal, es un término "de cosecha propia" que uso para referirme al proceso de validación de datos de manera compacta en lenguajes dinámicos (php, javascript).

La verdad es que la idea original la hice en PHP hace mucho tiempo, pero con un par de cambios se puede adaptar a otros lenguajes.

La idea original es la siguiente: supongamos que tenemos una función de distribución de flujo (o un objeto) que se basa en un parámetro de entrada, de manera que haría algo así:

[code lan=gral] /** * @param k: valor de entrada */ if(k == ~"fun1~"){ funcion1(); }else if(k == ~"fun2~"){ funcion2(); }else if(k == ~"fun3~"){ funcion3(); }else if(k == ~"fun4~"){ funcion4(); }else if(k == ~"fun5~"){ funcion5(); }else if(k == ~"fun6~"){ funcion6(); } [/code]

Se entiende, ¿no? Yo he llegado a tener un bloque de unas 40 funciones (ya os explicaré algún día, lo tengo pendiente) y claro... es un caos y añadir cosas a este bloque es una locura.

Por suerte, PHP tiene un par de elementos que combinados adecuadamente puede salvarnos el culo en estas ocasiones.

Empezamos por el primer concepto: Array asociativo.

En PHP tenemos el típico array, y luego el asociativo. Este tipo de Array se visualiza de la siguiente manera:

['k1' => 'v1', 'k2' => 'v2', 'k3' => 'v3...]

Se puede recorrer como un array normal, pero se puede usar también una variación de la instrucción foreach de la manera siguiente:

foreach(array as clave => valor)

De manera que por cada elemento de "array" tendremos guardada la clave en "clave" y el valor en "valor".

Pasemos al siguiente concepto: llamar a funciones desde variables. En PHP funciona as is, es decir, puedes poner una variable seguida de "()" e intentará enlazar una función.

Con todo esto, podemos hacer lo siguiente:

[code lan=gral] $x =[~"fun1~" => ~"funcion1~", ~"fun2~" => ~"funcion2~", ~"fun3~" => ~"funcion3~"]; foreach($x as $y => $z){ if($k == $y){ $z(); } } [/code]

Y tenemos todo solventado.

PERO

Más aún... se puede compactar un poquito más...

[code lan=gral] $x =[~"fun1~" => ~"funcion1~", ~"fun2~" => ~"funcion2~", ~"fun3~" => ~"funcion3~"]; if(array_key_exists($k, $x)){ $x[$k](); } [/code]

¡¡YA ESTÁ!! con un IF nos quitamos todo de encima... si queréis hasta le podéis quitar los corchetes al if...

Aclarar que "array_key_exists" es una función nativa de PHP así que no tenemos que pensar siquiera en implementarla.

Y otra cosa más... imaginad que las claves son iguales que las funciones... podríamos entonces hacer lo siguiente:

[code lan=gral] $x =[~"fun1~", ~"fun2~", ~"fun3~"]; if(in_array($k, $x){ $x[$k](); } [/code]

Bien, esto en PHP. Ahora bien... ¿En JavaScript?

Para ello deberíamos hacer uso, en el primer ejemplo, de un array auxiliar... es decir:

array1[claves]
array2[funciones]

Después, iterar sobre las claves y guardar el índice para acceder a la función (mediante un eval(), por ejemplo, o bien haciendo que cada elemento del array de funciones sea una función - cosas de que no existan tipos en JS).

Para un "acceso directo" se efecutaría del mismo modo.

Pues nada gente, espero que en algún momento sea útil esta info. para vosotros.

¡Hasta la próxima!