Tivoli Service Desk 6.0 Developer's Toolkit Script プログラミングの手引き
この章では、テストおよびテスト条件に対する応答を扱う条件構造および制御構造について説明しています。こうした構造は、プログラムの流れを更新し、必要に応じてアクションを反復する手段も提供します。
Developer's Toolkit は、次の 2 つの条件構造を提供しています。
Developer's Toolkit は、プログラムの流れを更新するための幾つかの構造を提供しています。
Developer's Toolkit の IF ステートメントの一般形式は次の通りです。
IF <condition> THEN <statement-list> ELSIF <2nd condition> THEN <statement-list> ELSE <statement-list> END;
ELSIF および ELSE ステートメントは、条件が 1 つしかテストされない場合には不要です。
この構造の使用例は次の通りです。
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 is a string *) END;
IF と ELSIF には、常にブール条件が続きます。条件が TRUE と評価された場合には、IF の後のステートメントが実行され、そうでない場合には、ELSIF が実行されます。
条件が FALSE に評価された場合には、次の 3 つのうちの 1 つが起こります。
Developer's Toolkit は、短絡ブール評価を使用します。 これは、2 つの文節を評価した場合には、次のようになるということを意味します。
WHEN ステートメントは、特殊な形式の IF ステートメントで、変数または式の値に基づいてアクションを実行できるようにします。
次の IF ステートメントを考えてください。
IF i*j = 1 THEN WriteOne; ELSIF i*j = 2 THEN WriteTwo; ELSIF i*j = 3 THEN WriteThree; ELSE WriteOther; END;
上の例では、式 i*j から戻された値を検査することの中には、各入力値の式を計算し直すことが含まれます。i*j が 3 より大きくなっている場合には、式 i*j が 3 回評価されます。
このメソッドには、2 つのマイナスの副次作用があります。
代替メソッドとして、i*j の値をローカル変数に割り当て、IF ステートメント中のその値を使用することができます。
保守とパフォーマンスの両方のよりよいソリューションとして、IF ステートメントの代わりに WHEN ステートメントを使用することができます。
Developer's Toolkit の WHEN ステートメントは、以下に示しているように条件を評価するよりよい方法を提供しています。
WHEN i*j IS 1 THEN WriteOne; ELSWHEN 2 THEN WriteTwo; ELSWHEN 3 THEN WriteThree; ELSE WriteOther; END;
WHEN ステートメントは、式を 1 回評価してから、それをテスト値のそれぞれに比較します。式は、単純データ・タイプまたはストリングでなければなりません。
注: ストリングで使用される時には、WHEN は、大文字小文字の区別がありません。
次の例で示したコンマで区切られた形式を使用することによって、複数のテスト値を指定することもできます。
WHEN i*j IS 1,2,3 DO WriteOne; ELSWHEN 4,5,6 DO WriteTwo; ELSWHEN 7,8,9 DO WriteThree; ELSE WriteOther; END;
FOR ループ構造は、1 つまたは複数のステートメントを事前に定義された回数実行するために使用されます。FOR 構造は、次の形式を取ります。
FOR <loop-parameter>:=<lo-bound> TO <hi-bound> DO <statement-list> END;
この形式の継続は、次の表に示しています。
継続 | 説明 |
<loop-parameter> | <lo-bound> と <hi-bound> の間 (両者を含む) の値に割り当てられた整数変数 |
<lo-bound> | ループの先頭で 1 回評価され、<loop-parameter> に割り当てられた整数式 |
<hi-bound> | ループの先頭で 1 回評価され、ループを通過するたびに <loop-parameter> の値と比較される整数式 |
<statement-list> | <lo-bound> と <hi-bound> の間 (両者を含む) の <loop-parameter> のすべての値に対して実行される Developer's Toolkit の 1 つまたは複数のステートメント |
次の例は、FOR ステートメントの一番簡単な使い方を示したものです。この例では、ストリングが 10 回画面に書き込まれます。 i 変数の値は、ステートメント・リスト内では使用されません。
FOR i:=1 TO 10 DO WinWriteLN(myWindow,'Hello'); END;
次の例は少し複雑になっています。
FOR i:=j TO k*3 DO WinWriteLN(myWindow,'i = ' & i); END;
注: 下限が上限に等しい場合には、ステートメント・リストが 1 回実行されます。下限が上限より大きくなっている場合には、ステートメント・リストはまったく実行されません。
キーワード DOWNTO は、次の例で示しているように、高い値から低い値のほうにループを実行するために、TO の代わりに使用することができます。
FOR i:=10 DOWNTO 1 DO WinWriteLN(myWindow,i); END;
FOR ステートメントは、タイプ LIST の変数で使用される 2 番目の形式をもっています。
FOR <list-parameter> DO <statement-list> END;
ここでは、ステートメント・リストは、リスト・パラメーター中の各メンバーに 1 回実行されます。 リスト・パラメーターの現在の要素ポインター $Current は、リスト中の最初の要素を示すように初期化されています。ステートメント・リストの実行の終わりで、要素ポインターが前に進みます。これにより、リスト中のすべての要素に 1 つまたは複数のステートメントが実行できるようになります。
次の例を考えてください。
ListInsert(myList,'One'); ListInsert(myList,'Two'); ListInsert(myList,'Three'); FOR myList DO WinWriteLN(myWindow,myList[$Current]); END;
REPEAT ループ構造は、1 セットのステートメントを 1 回実行してから、一定の条件が True となるまで、それらを実行し続けます。
REPEAT ループ構造は、次の形式をもちます。
REPEAT <statement-list> UNTIL <condition>;
次のコードは、ストリング 'Hello' を 10 回画面に書き込みます。
i:=1; REPEAT WinWriteLN(myWindow,'Hello'); i:=i + 1; UNTIL i > 10;
前の例では、<condition> は、ループのたびに評価されるブール式です。FALSE と評価されると、<statement-list> 中のステートメントがもう一度実行されます。
ブール式は、次のものによって結合された文節からなります。
文節は、関係演算子 (=、>、<、など) によって区切られた互換データ・タイプの 2 つの式からなります。
WHILE ループ構造は REPEAT ループ構造と似ていますが、出口条件がループの終わりではなく、ループの先頭でテストされます。 REPEAT ループ構造中のステートメントは、少なくとも 1 回実行されることを保証されていますが、WHILE ループ構造中のステートメントは、ループ条件が最初に False である場合にはまったく実行されません。
WHILE ループ構造は次の形式をもちます。
WHILE <condition> DO <statement-list> END;
次のプログラムでは、ストリング 'Hello' が 10 回画面に書き込まれます。
i:=1; WHILE i <= 10 DO WinWriteLN('Hello'); i:=i + 1; END;
Exit ステートメントは、関数またはプロシージャーに対する呼び出しから出るために使用することができます。出されると、FOR、 REPEAT、または WHILE ループの内部にある場合にも、これは現行ルーチンを完全に終結します。
その名前が暗示するように、ExitLoop ステートメントは、終了条件が True となる前にループから出るために使用することができます。
次の例では、ループは、EMPLOYEES データベース・テーブルからすべての行を読み取って印刷するようにセットアップされています。1 より小さい値を戻した (したがってエラーまたは結果セットの終わりを示した) ために SQLFetch ステートメントが失敗した場合には、 ExitLoop ステートメントでループの実行が終結します。ループの直後に続くステートメントが次に実行されるステートメントです。
次の例は、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 Script プログラミングの手引き