Sentencias while
Utilice la sentencia while para ejecutar en bucle
un conjunto de instrucciones hasta que se cumpla una condición determinada.
Puede utilizar la sentencia while para repetir un conjunto de operaciones hasta que se cumpla la condición especificada. La sentencia while utilizada en el
Lenguaje de políticas de Impact es la misma que la utilizada en lenguajes de programación tales como C, C++ y Java.
La sintaxis de la sentencia while consta de la palabra clave
while seguida de una expresión booleana encerrada entre
paréntesis. Esta expresión está seguida por un bloque de sentencias delimitado por llaves
de cierre.
while (condición) { sentencias }
Donde condición es una expresión booleana y
sentencias es una o varias sentencias. Por ejemplo:
I = 10;
while(I > 0) {
Log("El valor de I es: " + I);
I = I - 1;
}
Cuando la palabra clave while se encuentra en una política, la expresión booleana, se evalúa para
ver si es verdadera. Si la expresión es verdadera, se ejecuta el bloque de sentencias que sigue a la
expresión.
Una vez ejecutadas las sentencias, Netcool/Impact evalúa de nuevo la
expresión y sigue ejecutando el bloque de sentencias repetidamente hasta que la
condición sea falsa.
La forma más habitual de utilizar la sentencia while es
crear un bucle que se ejecuta un determinado número de veces de acuerdo con
otros factores contenidos en una política. Para utilizar la sentencia while de esta manera, se utiliza
una variable entera como contador. El valor del contador se define antes de comenzar el bucle
while y decrece con cada ejecución del bucle. La sentencia while examina el valor del contador cada vez que se ejecuta el
bucle y concluye su ejecución cuando el valor del contador es cero.
El ejemplo siguiente muestra una utilización simple de la sentencia
while:
Counter = 10;
while (Counter > 0) {
Log("El valor de Counter es " + Counter);
Counter = Counter - 1;
}En este caso, asigna el valor 10 a una variable denominada
Counter. En la sentencia while,la política
evalúa el valor de Counter para ver si es mayor que cero. Si Counter es mayor que
cero, se ejecutan las sentencias del bloque siguiente. La sentencia final del bloque decrementa el valor de Counter
en una unidad. El bucle while del ejemplo se ejecuta 10 veces antes de concluir.
Cuando se ejecuta este ejemplo, escribe el mensaje siguiente en el registro de políticas:
El valor de Counter es 10
El valor de Counter es 9
El valor de Counter es 8
El valor de Counter es 7
El valor de Counter es 6
El valor de Counter es 5
El valor de Counter es 4
El valor de Counter es 3
El valor de Counter es 2
El valor de Counter es 1El ejemplo siguiente muestra cómo utilizar la sentencia while para ejecutar en bucle sobre una matriz. Esta técnica se utiliza a menudo cuando maneja datos recuperados de un origen de datos.
MyArray = {"One", "Two", "Three", "Four"};
Counter = Length(MyArray);
while (Counter > 0) {
Index = Counter - 1;
Log(MyArray[Index]);
Counter = Counter - 1;
}En este caso, el valor de Counter se establece en el
número de elementos de la matriz. La sentencia while ejecuta en bucle el bloque de sentencias una vez para cada
elemento de la matriz. El valor de la variable Index se establece en el valor de Counter menos 1. Esto es porque las
matrices de IPL están basadas en cero. Por tanto, el valor de índice del primer elemento es 0, en
lugar de 1.
Cuando se ejecuta este ejemplo, escribe el mensaje siguiente en el registro de políticas:
Four
Three
Two
OneEn estos ejemplos, cuando utiliza esta técnica para recorrer los elementos de una matriz, accede a los elementos en orden inverso. Para evitar esto, puede incrementar el valor del contador en lugar de decrementarlo con cada ejecución del bucle. Para ello es necesario evaluar si el valor del contador es menor que el número de elementos de la matriz dentro de la sentencia while.
El ejemplo siguiente muestra cómo incrementar el valor del contador al recorrer en bucle una matriz.
MyArray = {"One", "Two", "Three", "Four"};
ArrayLength = Length(MyArray);
Counter = 0;
while (Counter < ArrayLength) {
Log(MyArray[Counter]);
Counter = Counter + 1;
}Cuando se ejecuta esta política, escribe el mensaje siguiente en el registro de políticas:
One
Two
Three
FourWHILE; esto puede provocar una política de bucle infinito que a su vez puede provocar que se agote la memoria. Para evitarlo, se puede añadir una propiedad maxloopsize a NCI_server.props. Por ejemplo:
impact.policy.maxloopsize=50
Si un bucle WHILE de una política IPL se ejecuta más veces de las especificadas por la propiedad maxloopsize, la política interrumpirá el bucle WHILE y se generará el error siguiente en el archivo impactserver.log:
ERROR
[IPLImpactActionInterpreterVisitor] La política myWHILELoop ha ejecutado el bucle más de 50 veces