2010-05-27T01:24:50+09:00

AppleScript のスクリプトオブジェクトでクラスを作ろう(その1)

AppleScript のスクリプトオブジェクトでクラスを表現することを解説するぜ。現在、AppleScript でもモジュール/ライブラリを使う文化を根付かせたいと思っている。使いやすいモジュールを作る上で、クラスの概念があると取っても便利。でも、AppleScript のオブジェクトシステムはプロトタイプベースでクラスベースじゃないぜ。でも、スクリプトオブジェクトでクラスを表現することはできる。その実装の仕方と、クラスの何がいいのかを解説するぜ。

まずは、言葉の定義から確認しよう。オブジェクト指向プログラミングでいうオブジェクトとは、「自分が何ができるか知っているデータ」のことであり、クラスとはオブジェクトのひな形であるということでよいかな?

AppleScript でも、オブジェクトとかクラスとかいう用語は使われている。例えば、リストはリストクラスのオブジェクトであり、アプリケーションはアプリケーションクラスのオブジェクトということになっている。でも、これらはオブジェクト指向言語でいうオブジェクトとクラスとはちょっと違うぜ。何が違うかというと、AppleScript でいうオブジェクトは自分が何が出来るかということを知らない。アプリケーションにはいくつかのコマンドが実装されていたりするけど、それらはそのアプリケーションで定義されている何らかのクラスに結びつけられている訳じゃない。だから、AppleScript にとってアプリケーションはオブジェクト指向言語でいうオブジェクトではなく、属性の集合体にすぎない。そして、クラスとは属性の集合体の種類にしか過ぎない。でも、その属性の集合体には継承関係があったりするので、ただのクラスはデータの種類という訳でもないのがややこしいところ。まとめると、

一方で、スクリプトオブジェクトはちゃんとしたオブジェクトだ。property がデータであり、そのデータを処理する為のメソッドをハンドラとして定義できる。AppleScript の世界でオブジェクト指向言語でいうオブジェクトはスクリプトオブジェクトだけだ。でも、オブジェクト指向言語でいうクラスはないぜ。AppleScript のオブジェクトシステムは、クラスベースの言語とちがってオブジェクトがいきなり存在するプロトタイプベースという方式らしい。

プロトタイプベースのいいことは、クラスからオブジェクト生成というプロセスを省けること。使いたいオブジェクトが一つだけなら、これでいいぜ。でも、不都合な点もいくつかある。

その一つは、同じ種類のオブジェクトが複数欲しい場合は、copy コマンドでオブジェクトの複製をつくる必要があること。これは、property だけでなくハンドラまでコピーされちゃうから、めちゃめちゃ効率が悪いぜ。普通はハンドラの実装はどこかに一つだけあって複数のオブジェクトから共有されればいいでしょう?でも、copy すると、property が複製されるにとどまらず、ハンドラも、継承している親オブジェクトも、何もかもコピーされちゃうんだぜ。実際のところ、property だけ複製できればいいでしょう。

一方、クラスベースのオブジェクト指向言語では、メソッドはクラスに実装されており、オブジェクトはどのクラスに所属しているかだけを知っている。クラスによって、オブジェクト間でメソッドの実装を共有できている訳だ。

これを AppleScript のスクリプトオブジェクトで表現しよう。オブジェクト自身は property だけを持っていて、メソッド(ハンドラ)を実装したスクリプトオブジェクトを継承すればよい。

そして、複数の同種のオブジェクトが必要な場合、コンストラクタメソッドを経由してオブジェクトを生成した方がいい。copy コマンドによる複製だとオブジェクトの初期化に一手間必要になる。すると、オブジェクトのコピー及び初期化処理をまとめたハンドラを用意することになる。もう、これはコンストラクタメソッドだよね。

クラスを表現したスクリプトオブジェクトをクラスオブジェクトと呼ぶことにしよう。クラスオブジェクトの用件をまとめるぜ。

次回につづく。