load scriptはglobalが良いのかlocalが良いのか
アップルスクリプトの変数はハンドラ内だけで定義されるlocal変数と、ハンドラ以外でもスクリプト全体で定義されるglobalな変数があります。
property gF : load script file (((path to home folder from user domain) as string) & "Dropbox:Scripts:M-loop_pub.scpt") as alias
-->グローバル変数gFへのM-loop_pub.scptのロード、スクリプトのトップに宣言されることが多い
on idle {}
set f to load script file (((path to home folder from user domain) as string) & "Dropbox:Scripts:M-loop_pub.scpt") as alias
-->ローカルハンドラ内でのfへのM-loop_pub.scptのロード
set gP to MainLoop(gP) of f
return gP's loopPerSec
end idle
今回のスクリプトはload scriptで別ファイルのスクリプトを変数内に格納してハンドラをコールしてますが、この際格納する変数をglobalにするかlocalで定義するかはいろいろ異論があると思います。 ちなみに私はlocal派です。
古いApplescriptの教本やネット上の記載を見るとサブScriptはグローバル変数に格納されていることがほとんどですね。 昔のマックは遅かったしファイルを読み込みに行くのにも少し時間がかかったからってのもあると思うんですが、最近のハードはディスクアクセスが早いですし今回の私のスクリプトでは全部ハンドラ内(ローカル)に読み込んでます。 そのメリットとデメリットをまとめて見ましょうか?
Load scriptをGlobal変数に格納するメリット
- サブスクリプトをコンパイルしてセーブするときにファイルにアクセスしてセーブするので、ハンドラを呼び出すたびにディスクアクセスが発生しないため速度が速いはず。
- サブスクリプトが消滅したり、メインスクリプトを他人に渡したりする時にサブのスクリプトファイルを他人に渡す必要が無くてパスワードの管理などが楽? あと著作権とか?
Load scriptをGlobal変数に格納するデメリット
- ファイルをセーブするタイミングでのサブスクリプトの情報で固定されるので、サブスクリプトを編集するたびにメインのスクリプトを変更する必要がある。 さらに孫スクリプトとかを作ってたりすると、全て修正するために全てのファイルを開けたり閉じたりする必要がある。
- 場合によっては、孫スクリプトを直接メインスクリプトにロードする必要があったりすると、同じ記述が重なってメインスクリプトにロードされることになり、回帰的な重複が生じる場合がある。
- アップルスクリプトのスクリプトファイルは目安として1MBを超えるとセーブ不能になるため、大きな子プロセスの中のほんの一個だけのハンドラをロードするためにメインスクリプトのファイルサイズが予想外に大きくなる場合がある。 スクリプトを修正していたら突然セーブ出来なくなるという事態を経験することがある。
- 子スクリプトファイルを編集してもすぐに親スクリプトに反映されないため、バグ取りの際に修正されたはずの物が修正されていなくて混乱することがある。
- 最近のSSDを使った速いバスシステムと最大ファイル数1MBのアップルスクリプトのデーターロード時間は、現実的にプログラムの体感実行時間にあまり大きな影響を及ぼさない事が多い。
- ファイルサイズに上限があるので、子スクリプトは自然と細切れになり、ロードするスクリプトが多くなりすぎる。 また同系統のハンドラが別のファイルに存在すると管理が難しくなるし、同系統のハンドラ同士で使い回しが有った場合、さらに管理がややこしくなる。 なので出来れば同系統のハンドラを1個のファイルで管理したい。
20年まえならいざ知らず、今のマックならLoad scriptはlocal変数に格納すべきだと思います。
これで私が書くアップルスクリプトのコンセプトは網羅したと思います。 じゃあそろそろ次ぐらいからfoltia用のM-loop_pubに付けるオプションを記載して見ましょうか?
最初はHandBrakeCLIの利用オプションです。