Fórmula: Más poder detrás de la simplicidad

Traducido automáticamente de Deepl

El comando Formula está disponible desde 4D v17 R3. Hasta ahora habrás pensado en asignar una fórmula como método a un objeto o en construir objetos inteligentes que puedan calcular valores o hacer cualquier cosa que necesites. Eso es realmente genial, ¡y hay más de lo que parece!

Tuve una gran demostración de Vincent de Lachaux – Desarrollador y experto 4D – sobre cómo utiliza este comando. Para esta entrada en el blog, compilé diferentes escenarios de esa demostración para darle una visión sobre una dimensión diferente de este comando.

Ejemplo 1 – Para simplificar un comando existente

Algunos comandos de 4D se utilizan cientos de miles de veces en el código. Amenudo pasamos los mismos parámetros excepto uno.

Tomemos el sencillo ejemplo del comando OBJECT get pointer. Quiero inicializar los valores de mis casillas de verificación, así que escribo

(OBJECT get pointer(Object named; "checkbox"))->:=0

O bien, escribo una fórmula que toma el nombre de mi objeto como parámetro:

interface.puntero:=Formula(OBJECT Get pointer(Object named;$1))

Cuando quiero asignar o recuperar el valor de mi casilla, simplemente escribo

(interface.pointer("checkbox"))->:=0
(interface.pointer("checkbox2"))->:=0

O bien, si necesito configurar miles de casillas de verificación, puedo crear una fórmula para simplificar las cosas:

interface.setCheckbox:=Formula((OBJECT Get pointer(Object named;$1))->:=$2)

Para establecer una serie de casillas de verificación, puedo escribir simplemente:

interface.setCheckbox("checkbox1";0)
interface .setCheckbox("checkbox2";1)
interface .setCheckbox("checkbox3";0)
interface .setCheckbox("checkbox4";1)

Más fácil de leer – y mucho más fácil de escribir, ya que no necesito contar paréntesis…

Ejemplo 2 – Con un parámetro de base de datos

En su código, establezca el mismo parámetro de la base de datos varias veces con diferentes valores. Tomemos un ejemplo concreto con consejos de control de retardo. Puede que quiera mostrar los consejos sin retardo en algunas partes de sus formularios, y esperar 1s en otras partes. Cada vez que utilice el parámetro de la base de datos, deberá recordar el valor o buscarlo en otra parte del código.

¿Por qué no crear una fórmula?

interface.tipsNoDelay:=Formula(SET DATABASE PARAMETER(Tips delay;1))
interface .tips1sDelay:=Formula(SET DATABASE PARAMETER(Tips delay;60))

Luego, cuando quieras cambiar el valor, sólo tienes que llamar a la fórmula:

interface.tips1sDelay()
// or

interface .tipsNoDelay()

Ejemplo 3 – Utilizar la fórmula como variante

Puedes crear una fórmula que utilice los valores pasados como parámetros de un método(es decir, $1, $2) pero, en el método en el que creas tu fórmula, no necesitas escribir $1 y $2. Las variables se escriben cuando se ejecuta la fórmula. Puedes escribir métodos o fórmulas genéricas.

Aquí hay un ejemplo sencillo que muestra que el tipo se define en la ejecución.

$obj:=New object("adición";Formula($1+$2))

$number :=$obj.addition(1;2) // devuelve 3
$text :=$obj.addition("hola "; "mundo") // devuelve hola mundo

Ejemplo 4 – Probar una serie de condiciones

Si hace una secuencia de condiciones, como If (() & ()), 4D siempre evalúa todas las condiciones. No se detiene y sigue evaluando las siguientes. Si algunas condiciones sólo pueden ser evaluadas si las de la izquierda son verdaderas, se ve obligado a hacer una lista anidada profunda de condiciones if, para comprobar si el objeto es válido antes de probar el atributo. Esto es así:

If (Not(Undefined($o))
If ($o.value#Null)
If ($o.value<5)
// to do
End if
End if
End if

En este ejemplo, teníamos «sólo» 3 condiciones, pero puedes notar fácilmente que se vuelve más y más complejo. ¿Qué tal si escribimos todo en una sola condición? ¿Por qué no escribir un método que ejecute sus fórmulas una tras otra? Si el resultado es True, evalúa la siguiente fórmula, si el resultado es false, se detiene y devuelve False.

If (_AND (\
Formula (Not(Undefined($o)));\
Formula ($o.value#Null);\
Formula ($o.value<5)\
))
// to do
End if

Para el método _AND, código muy habitual y sencillo:

$0:=True
For ($i;1;Count parameters;1)
$0 :=${$i}.call()
If (Not($0))
$i :=MAXLONG-1 // Stop if the condition fails
End if
End for

Espero que estos ejemplos te permitan conocer otras formas de utilizar este comando. No dudes en compartir tus fórmulas en el foro de 4D… ¡Estoy seguro de que tienes un montón de ideas!

Vanessa Talbot
• Propietario de producto - Vanessa Talbot llegó al equipo de 4D Program en junio de 2014. Como Propietario de producto, está a cargo de escribir las historias de los usuarios y luego traducirlas a especificaciones funcionales. Su papel es también asegurarse de que la implementación de la funcionalidad entregada cumpla con las necesidades del cliente. Desde su llegada, ha trabajado en la definición de funcionalidades claves en 4D. Ha trabajado en la mayoría de las nuevas funcionalidades de multi hilo apropiativo y también en un tema muy complejo: la nueva arquitectura para la aplicación engined. Vanessa es licenciada por Telecom Saint-Etienne. Comenzó su carrera en el Instituto de Investigación Criminal como desarrolladora del departamento audiovisual. También ha trabajado en medios de comunicación y en el ámbito médico como experta en soporte técnico, producción y documentación de nuevas funcionalidades.