楽に巨大なAppleScript Studioアプリを作る手法

■大きなアプリケーションを作るのが苦痛だったAppleScript Studio環境


AppleScript Studioでアプリケーションを作るのは、ある一定のレベルを超えなければ楽しい仕事である。


だが、他の言語処理系のようにフレームワークを読み込んできて使い回す、みたいな楽さはない。なので、毎回毎回同じようなGUIをInterface Builder上で作って、同じような処理をコピペでもってきて記述してきた。


これだと、ある程度以上の規模のアプリケーションを作ろうとしても、毎回毎回ゼロから作らなくてはならないので、効率がよろしくない。


AppleScript Studioで大規模なアプリケーションを作ろうとすると、「ありものをただつなぎ合わせる」程度の楽さで開発できることが絶対条件だ。フレームワークをプロジェクトに足せばOK、ぐらいの勢いでないととても開発していられない。



■AppleScriptを分割して呼び出す


このような問題を解決するのに編み出された、もっとも原始的な手法は、AppleScriptを複数のファイルに細分化することだった。メインのAppleScriptからload scriptコマンドを用いてメモリ上にAppleScriptを読み込んで実行するというものであり、GUIごと使い回すとかいうことはできなかった。それでも、1本の巨大なAppleScriptを使い回すのではなく、複数に分割することでさまざまな問題が発生するリスクを軽減することができた。巨大なScriptを編集しようとすると、AppleScript Studio(Xcode)環境に負荷がかかりすぎて、さまざまな怪奇現象が起こってしまうのだ。


Script分割はいまなお有効な手段であり、とくにコンパイルずみスクリプトをプロジェクトに追加するという手法は、毎回巨大な未コンパイルScriptをコンパイルするリスクを軽減することができた。



■複数プロジェクト(nib-ASのペア)を合成する


この後、長らく「Script分割」を超える方法は発見されてこなかったのだが……新たに編み出されたのが「プロジェクト同士の合成」(Fusion)というものだった。


これは、とりわけレジストコードの登録を必要とするアプリケーションを作りたい場合に、「レジストコードの登録部分とメイン部分を別々に作っておいて結合したい」というニーズを満たすために編み出されたものだ。


AppleScript Studioのアプリケーションというのは、乱暴な言い方をすれば……nibファイルと対になったAppleScriptのファイルが存在し、nibによって表示されるGUIからのイベントを対になっているAppleScriptが受信して実行する……という図式になる。


ここで、複数のプロジェクトを個別に作成しておき、nibファイルやAppleScriptファイルのファイル名がぶつからないようにしておけば、1つのプロジェクト内に複数のnib-AppleScriptペアが存在できることになる。概念だけでは分りにくいので実際の作業を示してみると、メインのプロジェクトの中にサブプロジェクト1のnibとAppleScriptをコピーしてくる……という具合いになる。


プロジェクト内に複数のnib-AppleScriptペアが存在できることは分るが、これだけではサブプロジェクト側は実行されない。必要になった時点でメインのプロジェクト側からサブプロジェクトのnibファイルを「load nib」命令で呼び出す。すると、サブプロジェクト側のGUIを表示することができるようになり……当然、そのGUIにヒモづけされているAppleScriptも呼び出されて実行できるようになる。



■イベントのScopeをnib/objectに変えればさらに統合は容易に


さらに研究を重ね、Interface Builder上でイベントのScopeを変更(普通はすべてGlobal)することで、同じ名称のウィンドウに置かれた同じ名称のボタン(button “b1” of window “w1” といったような)という構成のプロジェクト同士であっても、個別に対になっているAppleScriptを呼び出せるようになることを確認した。


これによって、まったく異なるアプリケーション同士でもGUIとAppleScriptのペアを使い回せることになってきた。しかも、そのための労力は従来よりもはるかに少ないもので済む。


ただし、これはあくまで複数のウィンドウから構成されるプロジェクト同士の話であって、もう少し小さな単位でプロジェクト合成ができることが望ましい。TabViewの中身とか、ドロワー内のViewとか……そのレベルで分割できるとよいのだが……。


そのあたりが目下の課題だ。

Copyright By Piyomaru Software. All Rights Reserved