Tivoli Service Desk 6.0 Developer's Toolkit - Guia de Programação do Script

Capítulo 3: Estruturas Condicionais e de Controle

Retornar ao Índice


Introdução

Este capítulo abrange as construções condicionais e de controle que manuseiam teste e a resposta às condições do teste. Estas construções fornecem também os meios para alterar o fluxo do programa ou para repetir ações, conforme necessário.

Construções condicionais

O Developer's Toolkit fornece duas construções condicionais:

Construções de Controle

O Developer's Toolkit fornece várias construções para a alteração do fluxo do programa:

A instrução IF

Forma da instrução IF

A forma geral da instrução IF do Developer's Toolkit é:

IF <condition> THEN 
  <statement-list> 
ELSIF <2nd condition> THEN 
  <statement-list> 
ELSE 
  <statement-list> 
END; 

As instruções ELSIF e ELSE não serão necessárias se apenas uma condição estiver sendo testada.

Exemplo de IF

As utilizações de exemplo desta construção são:

IF (age < 18) OR (age > 90) THEN 
  WRITELN('Improper age, please re-enter'); 
END; 
IF display = 'CGA' THEN 
  LoadCGADriver; 
ELSIF display = 'MCGA' THEN 
  LoadMCGADriver; 
ELSIF display = 'EGA' THEN 
  LoadEGADriver; 
ELSE 
  LoadVGADriver; 
END; 
IF processor = '8086' THEN 
  maxMem := 640000; 
  operatingSystem := 'DOS'; 
ELSE 
  maxMem := 16000000; 
  operatingSystem := 'OS/2'; 
(* operatingSystem é uma cadeia *)
END;


Condições verdadeiras

IF e ELSIF são sempre seguidas por uma condição Booleana. Se a condição for avaliada em TRUE, as instruções que seguem IF ou ELSIF serão executadas.

Condições falsas

Se a condição for avaliada em FALSE, ocorrerá um dos seguintes:

Avaliação Booleana em curto circuito

O Developer's Toolkit utiliza a avaliação Booleana em curto circuito. Isso significa que se você avaliar duas cláusulas:


A Instrução WHEN

As instruções WHEN são uma forma especial de instruções IF que permitem executar uma ação com base no valor de uma variável ou de uma expressão.

Exemplo da instrução IF

Considere a seguinte instrução IF:

IF i*j = 1 THEN 
  WriteOne; 
ELSIF i*j = 2 THEN 
  WriteTwo; 
ELSIF i*j = 3 THEN 
  WriteThree; 
ELSE 
  WriteOther; 
END; 

No exemplo anterior, a verificação do valor retornado da expressão i*j envolve o recalculo da expressão para cada valor de entrada. Se i*j for maior que 3, a expressão i*j será avaliada três vezes.

Este método possui dois efeitos colaterais negativos:

Um método alternativo deveria ser atribuído ao valor i*j para uma variável local e, em seguida, utilizar esta variável na instrução IF.

Exemplo da instrução WHEN

Uma solução melhor para a manutenção e o desempenho é utilizar uma instrução WHEN no lugar da instrução IF.

A instrução WHEN do Developer's Toolkit fornece um modo melhor para se avaliar uma condição, como mostrado abaixo.

WHEN i*j IS 1 THEN 
  WriteOne; 
ELSWHEN 2 THEN 
  WriteTwo; 
ELSWHEN 3 THEN 
  WriteThree; 
ELSE 
  WriteOther; 
END; 

A instrução WHEN avalia uma expressão uma vez e, em seguida, a compara com cada um dos valores de teste. A expressão deve ser constituída de inteiro ou cadeia de tipo de dados simples.

Nota: Quando utilizado com cadeias, WHEN não faz distinção de maiúsculas/minúsculas.

Você também pode especificar vários valores de teste utilizando formato delimitado por vírgula para este exemplo:

WHEN i*j IS 1,2,3 DO 
  WriteOne; 
ELSWHEN 4,5,6 DO 
  WriteTwo; 
ELSWHEN 7,8,9 DO 
  WriteThree; 
ELSE 
  WriteOther; 
END; 

Loops FOR

O elemento de loop FOR é utilizado para executar uma ou mais instruções em um número predeterminado de vezes. A construção FOR tem a seguinte forma:

FOR <loop-parameter>:=<lo-bound> TO <hi-bound> DO 
  <statement-list> 
END; 

Os constituintes desta forma estão mostrados na tabela.

Constituinte Descrição
<loop-parameter> Uma variável de inteiro que é atribuída aos valores entre <lo-bound> e <hi-bound> (inclusive)
<lo-bound> Uma expressão de inteiro que é avaliada uma vez no início do loop e é atribuída ao <loop-parameter>
<hi-bound> Uma expressão de inteiro que é avaliada uma vez no início do loop e comparada ao valor <loop-parameter> cada vez que passa pelo loop
<statement-list> Uma ou mais instruções do Developer's Toolkit que são executadas para cada valor <loop-parameter> entre <lo-bound> e <hi-bound> (inclusive)

Exemplo de FOR

O exemplo a seguir ilustra o uso mais simples da instrução FOR. Neste exemplo, uma cadeia é escrita no vídeo 10 vezes. O valor da variável i não é utilizado dentro da lista de instruções.

FOR i:=1 TO 10 DO 
  WinWriteLN(myWindow,'Hello'); 
END; 

O exemplo a seguir é um pouco mais complicado.

FOR i:=j TO k*3 DO 
  WinWriteLN(myWindow,'i = ' & i); 
END; 

Nota: Se o limite inferior for igual ao superior, a lista de instruções será executada uma vez. Se o limite inferior for maior que o superior, a lista de instruções não será executada de modo algum.

Como Utilizar DOWNTO

A palavra-chave DOWNTO pode ser utilizada no lugar de TO a fim de fazer um loop de um valor alto para um valor inferior, conforme mostrado no exemplo a seguir:

FOR i:=10 DOWNTO 1 DO 
  WinWriteLN(myWindow,i); 
END;


Como utilizar FOR nas listas

A instrução FOR tem uma segunda forma para ser utilizado com variáveis do tipo LIST:

FOR <list-parameter> DO 
  <statement-list> 
END; 

Aqui, a lista de instruções é executada uma vez para cada membro no parâmetro da lista. O ponteiro do elemento atual do parâmetro da lista, $Current, é incializado para apontar o primeiro elemento na lista. Ao final da execução da lista de instruções, o ponteiro do elemento é avançado. Isto permite que uma ou mais instruções sejam executadas para cada elemento em uma lista.

Considere o seguinte exemplo:

ListInsert(myList,'One'); 
ListInsert(myList,'Two'); 
ListInsert(myList,'Three'); 
FOR myList DO 
  WinWriteLN(myWindow,myList[$Current]); 
END; 

Loops REPEAT

O elemento de loop REPEAT executa um conjunto de instruções uma vez, e, em seguida, continua a executá-lo até que uma determinada condição se torne verdadeira.
O elemento de loop REPEAT possui o seguinte formato:

REPEAT 
  <statement-list> 
UNTIL <condition>; 

O seguinte código escreve a cadeia 'Hello' na tela 10 vezes:

i:=1; 
REPEAT 
  WinWriteLN(myWindow,'Hello'); 
  i:=i + 1; 
UNTIL i > 10; 

Expressões Booleanas

No exemplo anterior, <condição> é uma expressão booleana que é avaliada sempre através do loop. Se ele avaliar FALSE, as instruções em <lista de instruções> serão novamente executadas.
As expressões booleanas podem consistir em cláusulas conectadas por:

Uma cláusula consiste em duas expressões de tipos de dados compatíveis separados por um operador relacional (=, >, <, e assim por diante).

Loops WHILE

O elemento de loop WHILE é semelhante ao elemento de loop REPEAT, exceto que a condição de saída é testada no início do loop em vez de no final. Garante-se que as instruções em um elemento de loop REPEAT são executadas, pelo menos uma vez, mas as instruções em um elemento de loop WHILE de modo algum serão executadas se a condição de loop for inicialmente False.

Os elementos de loop WHILE possuem o seguinte formato:

WHILE <condition> DO 
  <statement-list> 
END; 

No programa a seguir a cadeia 'Hello' é escrita na tela 10 vezes

i:=1; 
WHILE i <= 10 DO 
  WinWriteLN('Hello'); 
  i:=i + 1; 
END; 

Instrução Exit e ExitLoop

Exit

A instrução Exit pode ser utilizada para sair de uma chamada para uma função ou um procedimento. Quando emitida, ela faz com que a rotina atual cesse completamente, mesmo se estiver colocada dentro de um loop FOR, REPEAT ou WHILE.

ExitLoop

Como o próprio nome implica, a instrução ExitLoop pode ser utilizada para sair de um loop antes que a condição de finalização se torne verdadeira.

No exemplo a seguir, um loop é configurado para ler e imprimir cada linha da tabela de banco de dados EMPLOYEES. Se a instrução SQLFetch falhar retornando um valor menor que 1 (indicando um erro ou o fim do conjunto de resultados), a instrução ExitLoop fará com que o loop cesse a execução. A instrução que segue imediatamente o loop é a próxima a ser executada.

Exemplo de ExitLoop

O exemplo a seguir ilustra o uso de ExitLoop.

VARIABLES 
  i: Integer; 
  cursor: SQLCursor; 
  employee: EmployeeRecord; 
ACTIONS 
  i:=SQLSelect(cursor,'SELECT * FROM EMPLOYEES'); 
  WHILE i > 0 DO 
    i:=SQLFetch(cursor,employee); 
    IF i < 1 THEN 
         ExitLoop; 
END; 
    PrintEmployee(employee); 
END; 
  SQLCloseCursor(cursor);

Tivoli Service Desk 6.0 Developer's Toolkit - Guia de Programação do Script

Retornar ao Índice

Copyright