Like a Boss: Let関数について語ろう

Let関数はわりと古く(v.7~)からある関数ですが、これを全く使っていないカスタムAppを今でも時々見かけます。複雑な計算式を作成しなくてはいけない場合、Let関数を使うかどうかで、計算式の保守性は大きく異なります。
今回はGeist Interactiveのブログシリーズ「Learn FileMaker Like a Boss」の3回目として、Let関数に関する記事を紹介します。


Geist Interactive

LIKE A BOSS: LET US DISCUSS THE FILEMAKER LET FUNCTION

(元記事はこちら)

Jeremy Brown
2018/2/26

この連載「Learn FileMaker Like A Boss」(ボスのようにFileMakerを学ぶ)では、よりよい開発者になるための手法・考え方・ツールを探っていきます。まず最初は、私自身がFileMakerの開発に関わった長年の間に発見したトピックから始めます。今回の記事では、FileMakerのLet関数を見ていきます。

私がFileMakerのLet関数を初めて使った日は、自分の開発のキャリアの中での大きなマイルストーンだったと思います。それは新しいドアを開き、開発者として自分を一段上に押し上げてくれました。それを使うことでよりクリーンな(より整理された、読みやすい)コードが書けるようになりました。小さくて、大したことのないような関数ですが、Let関数は開発者にとって強力なテクニックです。それでは、それについて語っていきましょう。

FileMakerのLet: 多目的な関数

Let関数には多くの用途があり、以下のことができます。

  • 変数に値(関数、フィールドの値、またはハードコードされたものなど)を格納する
  • 複雑な計算式をより小さなステップに分割する
  • この関数・スクリプト全体・データベースファイル全体に対して、複数の変数に値を割り当てます。
  • 内部で宣言された変数を使用して計算結果を返す

これらの目的により、コードはよりクリーンになり、複雑な計算も簡単にデバッグできるようになります。

まず始めに

Let文の例を次に示します。

シンプルだが完全なLet構文
シンプルだが完全なLet構文

関数の上部の[]の中は宣言領域で、その後ろが計算領域です。宣言領域で宣言あるいは計算されたものは、順番に計算され返されます。この例では、変数_aと_bを宣言し、それぞれに1と2を割り当てています。計算領域で、これら2つを足してその結果を返します。

構文

構文は重要で、いくつかルールがあります。

  • 複数の変数を割り当てない限り、[]は必要ありません。私は一貫性のある記述にするため、常に[]を使います。私はこの構文を割り当てたショートカットキーを使っていて、そこには[]が含まれています。
  • 宣言領域で宣言された最後の変数の後にはセミコロンを付けません。この図では、変数_endの後ろにセミコロンはありません。実際私はこれで苦労したのですが、結局宣言領域を常に_end変数で終了する方法に落ち着きました。
  • 計算領域には、1でも””でもいいので、何かが入っている必要があります。

計算式を入力できるところであれば、どこででもLet関数を使用できます。そしてどこで使っても役に立ち、上記のようなシンプルなものから非常に複雑なものまであります。

実際、計算式がより複雑になるほど、以下の2つの理由でLet関数が役に立ちます。

  • 変数は計算式の小さな部品になる
  • 変数は、繰り返し何度も使用されるフィールドまたは関数から、値を取得できる

サンプルを見ながら

ある会社の請求書システムを見てみます。(説明を簡略にするため)テーブルは、部品・請求書・請求書明細の3つです。請求書の明細行が入力されると、一部の部品に割引が適用される場合があります。それは合計額にも適用される必要があります。

しかし、時には一部の部品にだけ特別なセールが続いていることがあります。ビジネスロジックでは、2つの割引のうち大きい方を総コストに適用することになっています。

フィールドは以下の通りです。

サンプルフィールド
サンプルフィールド

Let文がなければ、総コストを計算する式は次のようになります。

典型的な複雑な計算式。結果は正しいが、読みづらい
典型的な複雑な計算式。結果は正しいが、読みづらい

この計算式は混乱していて読みにくいです。正しい結果 ($37.50)を返しますが、今後のメンテナンスを考えるとあまりありがたみがありません。これでは何が起こっているのかが分かりません。さて、この計算を行う別の方法があります。この記事のために、極端な計算式を選んでみました。

以下は、Let関数を使用した、同じ計算式です。

きれいに整形されたLet文
きれいに整形されたLet文

見やすくなったと思いませんか?

関数のそれぞれのパートを順に見てみましょう。

Let宣言領域の最初のパートでは、いくつかの変数を作成し現在のレコードから値を代入して、残りの部分でこれらを使用します。こうする理由は、単純に “_q”の方が “InvoiceLineItems :: Quantity”よりも短くて読みやすいからです。計算式を組み立てる時に、そのフィールドの値が必要な場所であればどこでも”_q”を使えます。ここでは5つの変数を作成して、それぞれにフィールドからの値を設定しています。

Let宣言領域の次のパートでは、上記の変数を使用して簡単な計算を実行します。この例では、最初に高い方の割引率を探して_discToUseに代入します。これは単純です。それから合計額と、_totalCostに対する割引率を見つけます。次に、割引率を掛け数として計算します。最後に_resultを求めます。

ここでの各ステップは簡単な計算であり、前の変数に次のステップが依存しています。この方法が、Let文の存在意義をとても大きくしています。個々の計算の部分が変数に入れられるので、データビューアを使用してこれらの変数の値を見ることによって計算結果がわかります。

すべての作業は変数の連鎖で実行されるため、計算領域ではただRound()という単純な計算を1つ実行するだけです。

こちらの方がはるかに簡単に読むことができます。確かに長くはなりますが、読みやすくなります。そして、将来の自分の大きな助けになります。

デバッグ

個々の値と小さな計算が変数に格納されます。データビューアでデバッグするときに、上記の変数の1つまたはすべてを簡単な文で返すことができます。私は以下のような文を書きます。

変数の値を返すことで計算が正しいことを確認する
変数の値を返すことで計算が正しいことを確認する

最終行のRound関数の結果をコメントアウトし、代わりにいくつかの計算結果の変数のListを返します。これで個々の計算式がどのように計算されたかを見ることができます。

「一度だけ」はいいことです

この計算を見てください。私の正しい年齢を返します。

Get( 現在の日付 )関数がたくさん入った計算式
Get( 日付 )関数がたくさん入った計算式

気づきましたか? (ハイライトされたテキストを見てください。)読みにくさに加えて、Get( 日付 )関数が10回使用されます。これは、FileMakerがその関数のところに来るたびにその関数を評価(計算)することを意味します。基本的には現在の日付を10回計算していることになりますが、これは不要な動作です。

代わりにLet関数を使用して、Get( 日付 ) を変数_currに保持します。これは1回きりで、残りの計算では変数を使用できるようになります。ミリ秒の単位かもしれませんが、それでも時間は節約されます。

その他の考察

準備

スクリプトまたは計算フィールド用にこれらの計算式をまとめるときには、私は常にデータビューアを使用するようにしてます。そうすることで、スクリプトやフィールドの計算式に入れ込む前に、すべての部品が正しく動作することをテストできます。

どこまで細かく分解するか?

Let機能を使用して、どこまでも深く一つ一つの計算式に細分化することができます。それ自体は問題ありません。一方で、いつでも複数の計算を組み合わせて1つの変数宣言にすることもできます。それはあなた次第ですが、未来の自分のことを考慮することを忘れないでください。未来の自分は、今のあなたにどうしてほしいでしょうか?

名前に意味はあるか?

以下の2点を除いて、私が選ぶ変数名に特別な意味はありません。

  1. 変数名の最初には必ずアンダースコア「_」をつけます。これは単に私が使っている慣例です。「~」で始める人もいますし、接頭辞をつけないという人もいます。
  2. 名前は重要です。Let文のポイントの1つは、複数の場所で “InvoiceLineItems :: Quantity”を使う代わりに “_q”を使うことなので、この変数が何を意味するかがわかるような名前にします。この例では、「_q」を「_quan」に変更して、それが「数量(quantity)」フィールドの値であることがよりわかるようにしてもいいでしょう。

さらに高度な利用

Let文の宣言領域で、ローカル変数($var)またはグローバル変数($$var, 当該ファイルの中でのみ有効)を設定することができます。これは非常に専門的な理由で使われるので、あまり見ることはないかもしれません。私は、通常の開発ではこの機能は使いません。スクリプトをデバッグするときに、ローカル変数の値を一時的に変更して、別のロジックが実行されるのを確認したいときに使うくらいです。

まとめ: FileMaker Let関数

FileMakerのLet関数は強力で、すべてのFileMaker開発者にとって不可欠なツールです。Let関数を使うことで、複雑な計算式を作成するときのデバックや、将来の見直し作業を容易にしてくれます。

Leave a Reply