はじめに
対象読者
- FileMaker Pro / ProAdvanced ( 以下 FMPA と略す ) でグローバル変数を扱っている人、もしくは、これから扱おうかなと思っている人
- 他プログラミング言語にあまり触れておらず「グローバル汚染」などと聞いてもピンとこない人
- 後編記事 FileMakerにおけるグローバル変数の管理:値セット編 から飛んできた人
- 過去の私
要旨
グローバル変数は便利だけれど無闇矢鱈に使うとバグの元になるので、適切に管理してあげると黒歴史を作らずに済むようになります。
では FMPA において、グローバル変数を適切に管理するにはどのようにしたらよいか?
FMPA はメタ的な内容を記述管理することが苦手なので、グローバル変数を扱う「スクリプト」そのもので管理しなくてはなりません。
まず本記事では「宣言すること」を主題とします。
前置き
そもそもグローバル変数とは
FMPA 以外でプログラミング言語に触れている人からしたら釈迦に説法な内容ですが……
変数には、大きくいって以下の二種があります。 FMPA での実装もこれにならっています。
- ローカル変数
- グローバル変数
両者の違いは、変数の値を保持できる範囲(空間)が狭いか、広いか、ということになります。
FMPA における両者の範囲は、以下の通りです。
-
ローカル変数
- 宣言されたスクリプト内のみにて。
- スクリプトが終了すると、ローカル変数は名前も値も消えます。
-
グローバル変数
- 宣言されたスクリプトが存在する FMPA ファイル内のみにて。
- ファイルが閉じられると、グローバル変数は名前も値も消えます。
- 逆に言えば、ファイルが閉じられない限りは、一度宣言されたグローバル変数は、名前も値も保持され続けています。
グローバル汚染という問題
グローバル変数が名前と値を保持し続ける範囲について、最後に述べましたが、この保持の広さこそが問題の根幹です。
「え、なんで? ずっと保持し続けているんだから便利じゃん?」
という素朴な感想を抱いているかもしれません。が、他プログラミング言語においては、極力、使わないで済むようにとされます。何故でしょう?
ひと言でいえば、「同じ名前で衝突する可能性がある」からです。(何で衝突したらマズイのか、というところまでは掘り下げません)
「え、そんな初心者めいたことしないってばー」
今の開発に集中している真っ最中なら、そうかもしれません。しかし、以下のようなシチュエーションについて考えてみてください。
- 時間が経ってからの再開発時に
- 他の人との協同開発時に
- サードパーティ製のものを利用する際に
もっとも、グローバル汚染するサードパーティ製のものなんてロクなものではry
しかも、グローバル変数がそもそも使われているのかどうかも定かでなく、どこのスクリプトで値セットされているのかも総ざらいで調査しないと判別しないとしたら……?
グローバル変数というのは、敵を倒すためにその瞬間は便利に役立つこともありますが、管理されていないと、自分をもまきこみかねない地雷となるわけです。
それでも FMPA では便利なグローバル変数
「そんなに脅すなら、じゃあ、グローバル変数なんて使わないでおこう」
となっては、しかし、もったいないです。
他言語であれば、どうぞどうぞ使わないでおきましょう、と素直にうなずいても差し支えないこと多しです。が、こと FMPA においては使わずにいるのは、実装できる機能の幅が減り、パフォーマンスが低下することにもなります。
例えば FMPA において、グローバル変数がどのような場面で力を発揮するかというと、以下のものが代表的なところとして挙げられます。
- ユーザの情報 ( IP, MAC Address, OS, etc... ) を環境変数として保持しておく
- 何度も参照するレコードの値を格納しておくことで、レコードへのアクセス回数を減らしパフォーマンス向上
- マージ変数としてレイアウト上に格納された値を表示する
「なるほどわかった。じゃあやっぱり、グローバル変数は使おうじゃないか。で、どうすりゃいい?」
となってくれた方、お待たせしました。いよいよ本題です。
本題
宣言するだけのスクリプトを用意する
グローバル変数を宣言する、ただそれだけのスクリプトを用意します。
「え、それだけ?」
いや、次回の記事で「値セット編」を用意しますが。とりあえず今回は、それだけ。
最初に述べました通り FMPA には開発におけるメタ的なことを記述しておく機能がありません。あればよいのに。
なので、スクリプトにおいてのみ宣言/値セットすることができるグローバル変数は、やはりスクリプトで管理するしかないのです。
というわけで、用意したものが以下になります。
分かりやすくグローバル変数を管理するためのスクリプトを格納しておくよ、というフォルダを一つ用意して、その中に declare.global_var というスクリプトを作成。
そこで、ひたすらグローバル変数の宣言だけしておきます。並び順はアルファベット昇順など、一見して分かりやすいものがよいかと。
あとは、このスクリプトを開きさえすれば、この FMP ファイルにおいて、どんなグローバル変数がどれだけ使われているか、というのが一目瞭然となります。
逆にいうと、これをしなければ、一目瞭然となりません。恐ろしいですね FMPA って。( DDR 書き出して文字列検索するとか……いやいや)
なお、値が "" ということで空の設定になっていますが、これだとデータビューアには反映されません。だからといって、仮の値を突っ込むのはやめておきましょう。
おわりに
前置きばかり長くなって本題が短くなりましたが……
とにかくまずは、このファイルで使われるグローバル変数はコレだ!! という宣言を、必ずしておくようにしましょう。これだけで、将来にわたってたくさんの人たち/自分たちが救われることになるのは間違いなしです。なんで過去の自分はこれをやらなかっry
次の記事では、宣言したグローバル変数への値セットをどのようにすべきか、ということについて書きます。
⇒ 後編記事 FileMakerにおけるグローバル変数の管理:値セット編
余談
なお FMPA には、グローバル変数による汚染よりもさらに恐ろしい、グローバルフィールド汚染なるものがありますが……こちらについてはひとまず触れないでおきます……