FileMaker 一歩進んだシステム開発 -汎化-


汎化って?

汎化という言葉をご存知でしょうか。e-Wordsによると、
「様々な異なる対象に共通する性質や、共通して適用できる法則などを見出すこと。」
とあります。
プログラミング的に捉えると、要は「同じ処理を何回も書かないようにしましょう」ってことですね。
気がついたら同じようなスクリプトを大量に作っていた、という経験がある方もいるのではないでしょうか。

例(Before)

例えば以下のような2つのスクリプトを作ったとします。

スクリプト① 名前のチェック

if [「名前」フィールドが空]
 ダイアログ表示 [名前が空だぞ]
 スクリプト終了
end if

スクリプト② 住所のチェック

if [「住所」フィールドが空]
 ダイアログ表示 [住所が入力されてないんだけど]
 スクリプト終了
end if

両方とも、フィールドが空ならダイアログメッセージを表示するスクリプトです。
例えば、ここで利用者から
「ダイアログメッセージがぶっきらぼうなので、丁寧語にしてください」
という要望があった場合、2つとも修正が発生しますね。2つならまだましですが、
これが100箇所あるような状況だと、ため息が止まりませんね。
メンテナンスも大変だし、修正漏れのリスクもあります。なので、以下のように修正します。

例(After)

スクリプト名:入力チェック

if [ <スクリプトの引数>が空]
  ダイアログ表示 [<スクリプトの引数>が空でございます。]
  スクリプト終了
ene if

これなら呼び出し元から引数を渡せば、どこからでも1つのスクリプトで事足ります。
これが汎化です。

実用的な汎化例

最後にもう1つだけ、実用的な具体例を挙げておきます。
検索に使える汎用スクリプトを作成します。

スクリプト(汎用検索)

解説

①FileMaker標準のエラーメッセージは邪魔なので、OFFにします。
②引数を2つ受け取って変数にセットしています。1行目がフィールド名、2行目が検索条件です。
 →GetValue(値一覧; 値番号)は、改行で区切られた文字から行番号を指定して値を取得する関数です。
③検索モードに切り替えます。
④念のためエラーが発生していないか確認し、エラーなら処理を終了します。
 →万が一切り替えに失敗した場合、次のフィールド設定で予期せぬデータ更新が行わるのを防ぐためです。
⑤フィールドを名前で設定します。ここで先ほど変数に入れておいた値を使います。
 →ここが汎化の要です!フィールド名を名前(文字列)で指定できるので、呼び出し元から好きな
  フィールドを設定できます。
⑥検索を実行。

呼び出し側

ボタン等からスクリプトを呼び出します。

解説

引数を2つ渡したいので、改行(¶)で繋いでいます。
GetFieldNameというのはFileMakerの標準関数で、指定したフィールドの名前を文字列として返してくれます。

このスクリプトを使えば、検索ボタンごとにスクリプトを作る必要がなくなります。
(例:「性別」が"女性"のみ、「部署」が"総務"以外 などなど)

追記

Ver17からスクリプトを名前で指定して実行できるようになったようですね。
これも汎化に使えそうです。そろそろ自分も17使ってみようかな...。

ばいちゃ

皆さんがこれまでに作成したアプリケーションも、汎化できるところが無いか
見直してみてはいかがでしょうか。また、これから作るという方も汎化を意識して、
1歩進んだシステム開発に挑戦してみてください。

こちらもよろしければご覧ください。
 FileMakerで登録/キャンセル制御したい
 FileMakerで分離モデルしてみたい
 FileMakerでアプリ作っていくよ【作って学ぼう】
 FileMakerでレスポンスが悪いときに確認すること
FileMaker 一歩進んだシステム開発 - 怖くないよカスタムメニュー -


LINEスタンプも作ってます