2025/02/18

@Do の使い方

先日『@If の使い方』についてまとめました。@If の構文は以下の通りでしたね。

@If(condition1; action1; condition2; action2; ... ; condition99; action99; else_action)

条件に一致した場合に実行される action には、ステートメントを一つしか書けません。ただ、実際にアプリを開発していると、複数のステートメントを書きたくなることがあります。


例えば、@If で紹介した例を拡張して考えます。今回のフィールド構成は次の通りです。

Type と Title フィールドが追加されており、Type の指定に応じて Category 値を変化させる仕様とします。

Type Category
"Title" Title フィールドを表示
未入力の場合は "(無題)" とする
"Category" 入力されたカテゴリまでを " - " でつなぐ
上位のカテゴリが未入力の場合は "(未設定)" と表示
すべて未入力の場合には、"(未設定)" と表示
上記以外 "(未定義のタイプ)" と表示

"Category" 選択時の仕様に変化はないので、その時作成した式を利用したいですよね。

xC1 := @If(Cat1 = ""; "(未設定)"; Cat1);
xC2 := @If(Cat2 = "" & Cat3 != ""; "(未設定)"; Cat2);

@Implode(@Trim(xC1:xC2:Cat3); " - ")


こんな時に効果があるのが @Do です。

@Do を使えば、複数のステートメントを 1 つにまとめることができます。これを利用すると Category フィールドの計算式は次のように記述できます。

@If(
   Type = "Title";
      @If(Title = ""; "(無題)"; Title);
   Type = "Category";
      @Do(
         xC1 := @If(Cat1 = ""; "(未設定)"; Cat1);
         xC2 := @If(Cat2 = ""; @If(Cat3 != ""; "(未設定)"; ""); Cat2);

         @Implode(@Trim(xC1:xC2:Cat3); " - ")

      );
      "(未定義のタイプ)"
)

@If から見ると Type = "Category" の時に実行する action は 1 ステートメントに見えるということですね。


実際アプリを見ていると、@Do を知らないのか、無理やり 1 ステートメントでまとめてある式を見ることがあります。

@If(
   Type = "Title";
      @If(Title = ""; "(無題)"; Title);
   Type = "Category";
      @Implode(@Trim(@If(Cat1 = ""; "(未設定)"; Cat1):@If(Cat2 = ""; @If(Cat3 != ""; "(未設定)"; ""); Cat2):Cat3); " - ");
      "(未定義のタイプ)"
)

この式でも仕様通り動作しますが、非常に分かりにくいですよね。まるで暗号化されたように見えます...。このような記述は、将来この式をメンテする人(自分を含む)を混乱させるだけですので、やめましょう。


0 件のコメント:

コメントを投稿