制御フロー
メソッドや関数が単純か複雑かに関係なく、開発者は3つのプログラミング構造のうち、1つ以上を常に使用します。 プログラミング構造は、メソッド内でステートメントが実行される順序を決定する実行フローをコントロールします。 3つのタイプの構造があります:
-
シーケンシャル: シーケンシャル構造は単純な線形構造です。 シーケンスとは、4Dが最初から最後まで次々に実行する一連のステートメントです。 オブジェクトメソッドで頻繁に使用される1行から成るルーチンはもっとも簡単なシーケンシャル構造の例です。 例:
[People]lastName:=Uppercase([People]lastName)
-
分岐: 分岐構造は、条件をテストし、その結果に基づいて異なる流れにメソッドを導きます。 条件は true または false に評価されるブール式です。
If...Else...End if
構文は分岐構造の一例で、処理フローを二つに分岐します。Case of...Else...End case
構文も分岐構造の一つで、処理フローをもっとたくさん分岐することができます。 -
ループ: メソッドの作成にあたって、何度も同じ処理を繰り返すことがあります。 これに実現するために、4D は以下のループ構造を備えています:
ループを制御する方法には、条件が満たされるまでループする方法と、指定した回数だけループする方法の2通りがあります。 各ループ構造はいずれの方法にも用いることができますが、While
ループと Repeat
ループは条件が満たされるまで繰り返す場合に、For
ループは指定した回数だけループする場合の利用に適切です。 For each...End for each
ループは両方を組み合わせることが可能で、オブジェクトやコレクション内でループするために設計されています。
注: 4Dはプログラム構造 (If/While/For/Caes of/Repeat/For each) を512レベルまで入れ子で記述できます。
If...Else...End if
If...Else...End if
による制御フロー構造の正式な構文は以下のようになります:
If(Boolean_Expression)
statement(s)
Else
statement(s)
End if
Else
部分はオプションであり、省略して以下のように記述できます:
If(Boolean_Expression)
statement(s)
End if
If...Else...End if
構造は、条件 (ブール式) が true か false かによって、処理の選択肢を2つメソッドに与えます。 ブール式が true の場合は、テストのすぐ後のステートメントを実行し、 ブール式が FALSE の場合には、Else 文のすぐ後のステートメントを実行します。 任意の Else
が省略されていた場合、End if
のすぐ後のステートメント (あれば) へと実行が続行されます。
ブール式は常に全体が評価されるという点に注意してください。 たとえば、以下のような場合:
If(MethodA & MethodB)
...
End if
この場合、両方のメソッドが true である場合に限り、式は true になります。 しかしながら MethodA が false であっても、4D は MethodB も評価するため、これは時間の無駄になります。 この場合には、以下のような構造を使用するほうが賢明といえます:
If(MethodA)
If(MethodB)
...
End if
End if
上記の結果はほぼ同じで、MethodB は必要な場合にのみ評価されます。
例題
// ユーザーに名前の入力を求めます
$Find:=Request("名前を入力してください")
If(OK=1)
QUERY([People];[People]LastName=$Find)
Else
ALERT("名前が入力されませんでした")
End if
Tip: 一方の条件に実行ステートメントがない分岐処理を書くこともできます。 下のようなコードはどちらも有効です:
If(Boolean_Expression)
Else
statement(s)
End if
または:
If(Boolean_Expression)
statement(s)
Else
End if
Case of...Else...End case
Case of...Else...End case
による制御フロー構造の正式な構文は以下のようになります:
Case of
:(Boolean_Expression)
statement(s)
:(Boolean_Expression)
statement(s)
.
.
.
:(Boolean_Expression)
statement(s)
Else
statement(s)
End case
Else
部分はオプションであり、省略して以下のように記述できます:
Case of
:(Boolean_Expression)
statement(s)
:(Boolean_Expression)
statement(s)
.
.
.
:(Boolean_Expression)
statement(s)
End case
If...Else...End if
と同様に、Case of...Else...End case
構造も処理の選択肢をメソッドに与えます。 If...Else...End
との違いは、Case of...Else...End case
構造が複数のブール式を評価し、その中から最初に true となるステートメントを実行することです。
ブール式の前にはそれぞれコロン (:
) を付けます。 コロンとブール式の組み合わせをケースと呼びます。 例えば以下の行はケースです:
:(bValidate=1)
最初に true になったケースに続く (次のケースまでの) ステートメントだけが実行されます。 true になるケースがない場合、どのステートメントも実行されません (Else
文が指定されていない場合) 。
最後のケースの後に Else 文を含むことができます。 すべてのケースが FALSE の場合に、Else
文の後のステートメントが実行されます。
例題
下記の例は数値変数を判定し、対応する数字をアラートボックスに表示します:
Case of
:(vResult=1) // 数値が1の場合
ALERT("一です。") // 1のアラートボックスを表示します
:(vResult=2) // 数値が2の場合
ALERT("二です。") // 2のアラートボックスを表示します
:(vResult=3) // 数値が3の場合
ALERT("三です。") // 3のアラートボックスを表示します
Else // 数値が1,2,3のいずれでもない場合
ALERT("一、二、三のいずれでもありません。")
End case
比較するために、同じことを If...Else...End if
構文で記述すると以下のようになります。
If(vResult=1) // 数値が1の場合
ALERT("一です。") // 1のアラートボックスを表示します
Else
If(vResult=2) // 数値が2の場合
ALERT("二です。") // 2のアラートボックスを表示します
Else
If(vResult=3) // 数値が3の場合
ALERT("三です。") // 3のアラートボックスを表示します
Else // 数値が1,2,3のいずれでもない場合
ALERT("一、二、三のいずれでもありません。")
End if
End if
End if