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 1

El 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
One

En 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
Four
Nota: A veces existirá el riesgo de no cumplirse la condición booleana de una sentencia WHILE; 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