Estructuras condicionales
Una estructura de ramificación permite que los métodos prueben una condición y tomen caminos alternativos, en función del resultado.
If...Else...End if
La sintaxis de la estructura condicional If...Else...End if
es:
If(Boolean_Expression)
statement(s)
Else
statement(s)
End if
Tenga en cuenta que la parte Else
es opcional; puede escribir:
If(Boolean_Expression)
statement(s)
End if
La estructura If...Else...End if
permite a su método elegir entre dos acciones, dependiendo de si una prueba (una expresión booleana) es TRUE o FALSE. Cuando la expresión booleana es TRUE, se ejecutan las sentencias que siguen inmediatamente a la prueba. Si la expresión booleana es FALSE, se ejecutan las instrucciones que siguen a la línea Else. El Else
es opcional; si se omite Else, la ejecución continúa con la primera instrucción (si la hay) que sigue al End if
.
Tenga en cuenta que la expresión booleana siempre se evalúa completamente. Considere en particular la siguiente prueba:
If(MethodA & MethodB)
...
End if
La expresión es TRUE sólo si los dos métodos son TRUE. Sin embargo, incluso si MethodA devuelve FALSE, 4D seguirá evaluando MethodB, lo que supone una pérdida de tiempo inútil. En este caso, es más interesante utilizar una estructura como:
If(MethodA)
If(MethodB)
...
End if
End if
El resultado es similar y MethodB se evalúa sólo si es necesario.
Ejemplo
// Ask the user to enter a name
$Find:=Request(Type a name)
If(OK=1)
QUERY([People];[People]LastName=$Find)
Else
ALERT("You did not enter a name.")
End if
End if
Consejo: la ramificación puede realizarse sin que las instrucciones se ejecuten en un caso u otro. Al desarrollar un algoritmo o una aplicación especializada, nada le impide escribir:
If(Boolean_Expression)
Else
statement(s)
End if
o:
If(Boolean_Expression)
statement(s)
Else
End if
Case of... Else...End case
The formal syntax of the Case of... Else...End case
control flow structure is:
Case of
:(Boolean_Expression)
statement(s)
:(Boolean_Expression)
statement(s)
.
.
.
:(Boolean_Expression)
statement(s)
Else
statement(s)
End case
Tenga en cuenta que la parte Else
es opcional; puede escribir:
Case of
:(Boolean_Expression)
statement(s)
:(Boolean_Expression)
statement(s)
.
.
.
:(Boolean_Expression)
statement(s)
End case
As with the If...Else...End if
structure, the Case of... Else...End case
structure also lets your method choose between alternative actions. Unlike the If...Else...End
if structure, the Case of... Else...End case
structure can test a reasonable unlimited number of Boolean expressions and take action depending on which one is TRUE.
Cada expresión booleana va precedida de dos puntos (:
). Esta combinación de los dos puntos y la expresión booleana se llama un caso. Por ejemplo, la siguiente línea es un caso:
:(bValidate=1)
Sólo se ejecutarán las instrucciones que sigan al primer caso TRUE (y hasta el siguiente). Si ninguno de los casos es TRUE, no se ejecutará ninguna de las instrucciones (si no se incluye la parte Else
).
Puede incluir una instrucción Else después del último caso. Si todos los casos son FALSE, se ejecutarán las instrucciones siguientes al Else
.
Ejemplo
Este ejemplo comprueba una variable numérica y muestra un cuadro de alerta con una palabra:
Case of
:((vResult=1) & (vCondition#2)) //this case will be detected first
... //statement(s)
:(vResult=1)
... //Si es 1, mostrar una alerta
:(vResult=2) //Probar si el número es 2
ALERT("Two.") Case of
:(vResult=1) //Probar si el número es 1
ALERT("One.") //Si es 1, mostrar una alerta
:(vResult=2) //Probar si el número es 2
ALERT("Two.") //Si es 2, mostrar una alerta
:(vResult=3) //Probar si el número es 3
ALERT("Three.") //Si es 3, mostrar una alerta
Else //Si no es 1, 2 o 3, mostrar una alerta
ALERT("It was not one, two, or three.")
//statement(s)
End case //Si es 3, mostrar una alerta
Else //Si no es 1, 2 o 3, mostrar una alerta
ALERT("It was not one, two, or three.")
//statement(s)
End case
Para comparar, aquí está la versión If...Else...End if
del mismo método:
If(vResult=1) //Probar si el número es 1
ALERT("One.") If(vResult=1) //Probar si el número es 1
ALERT("One.") If(vResult=1) //Probar si el número es 1
ALERT("One.") //Si es 1, mostrar una alerta
Else
If(vResult=2) //Probar si el número es 2
ALERT("Two.") //Si es 2, mostrar una alerta
Else
If(vResult=3) //Probar si el número es 3
ALERT("Three.") //Si es 3, mostrar una alerta
Else //Si no es 1, 2 o 3, mostrar una alerta
ALERT("It was not one, two, or three.")
End if
End if
End if //Si es 2, mostrar una alerta
Else
If(vResult=3) //Probar si el número es 3
ALERT("Three.") //Si es 3, mostrar una alerta
Else //Si no es 1, 2 o 3, mostrar una alerta
ALERT("It was not one, two, or three.")
End if
End if
End if //Si es 2, mostrar una alerta
Else
If(vResult=3) //Probar si el número es 3
ALERT("Three.") //Si es 3, mostrar una alerta
Else //Si no es 1, 2 o 3, mostrar una alerta
ALERT("It was not one, two, or three.")
End if
End if
End if
Remember that with a Case of... Else...End case
structure, only the first TRUE case is executed. Aunque dos o más casos sean TRUE, sólo se ejecutarán las instrucciones que siguen al primer caso TRUE.
En consecuencia, cuando quiera implementar pruebas jerárquicas, debe asegurarse de que las declaraciones de condición que están más abajo en el esquema jerárquico aparezcan primero en la secuencia de pruebas. Por ejemplo, si se quiere procesar el caso simple (vResult=1) y el caso complejo (vResult=1) & (vCondition#2) y se estructura el método de la siguiente manera: Por ejemplo, el siguiente código nunca verá detectada su última condición:
Case of
:(vResult=1) //Test if the number is 1
ALERT("One.") //If it is 1, display an alert
:(vResult=2) //Test if the number is 2
ALERT("Two.") //If it is 2, display an alert
:(vResult=3) //Test if the number is 3
ALERT("Three.") //If it is 3, display an alert
Else //If it is not 1, 2, or 3, display an alert
ALERT("It was not one, two, or three.")
End case
En el código anterior, la presencia de la segunda condición no se detecta, ya que la prueba "vResult=1" ramifica el código antes de cualquier otra prueba. Para que el código funcione correctamente, puedes escribirlo así:
If(vResult=1) //Test if the number is 1
ALERT("One.") //If it is 1, display an alert
Else
If(vResult=2) //Test if the number is 2
ALERT("Two.") //If it is 2, display an alert
Else
If(vResult=3) //Test if the number is 3
ALERT("Three.") //If it is 3, display an alert
Else //If it is not 1, 2, or 3, display an alert
ALERT("It was not one, two, or three.")
End if
End if
End if
Además, si quiere implementar pruebas jerárquicas, puede considerar el uso de código jerárquico.
Consejo: la ramificación puede realizarse sin que las instrucciones se ejecuten en un caso u otro. Al desarrollar un algoritmo o una aplicación especializada, nada le impide escribir:
Case of
:(Boolean_Expression)
:(Boolean_Expression)
...
:(Boolean_Expression)
statement(s)
Else
statement(s)
End case
o:
Case of
:(Boolean_Expression)
:(Boolean_Expression)
statement(s)
...
:(Boolean_Expression)
statement(s)
Else
End case
o:
Case of
Else
statement(s)
End case