![]() |
[1998 年 11 月号] |
[Happy Squeaking!!]
1.はじめに
1.2 なぜ Smalltalk?
1.2.3 Meta, Meta, - Better, Better!
また、Smalltalkでは、メタプログラミングを行うための多くの機能が備えられています。
インスタンス、クラスという通常の抽象度の区分に加えて、クラスの記述を行うための、更に抽象度を高めたメタクラスが用意されています。オブジェクト指向関係の入門書では、このメタクラスの存在について触れながらも、きちんとした説明を行っていないものが多く見られます。
Smalltalkでのメタクラスがどのようなものなのか理解することによって、メタという概念についての理解が進むことでしょう。
メタ機能は通常の小規模なプログラミングではあまり問題になることがありません。しかし、柔軟な変更が要求される再利用可能なソフトウェアを作成するには今後非常に重要な概念として認識されていくことが考えられます。
例えばCORBAのデザインパターンで有名なTomas
Mowbleyは、「CORBA Design Pattern
アーキテクチャからプログラミングまで」(IDGコミュニケーションズ刊)の中で、HVMというパターンについて述べています。Hは相互運用性を高めるための水平インターフェース(Horizontal)、Vはドメインごとに分割された垂直インターフェース(Vertical)を指します。これに対し、Mは、HとVを柔軟に変更可能にするためのメタインターフェースを指しています。メタ機能の採用により、大規模な分散環境内で各部分を単純に保ったままで、実行時の複雑なカスタマイズ要求に対応できるようになるのです。
このようなメタ機能(自己記述、変更能力)が素直に実現できているのがSmalltalkです。他の言語ではトリッキーに処理せざるを得ないこの機能もSmalltalでは実に簡潔に表現されています。
例えば、あるクラスで定義されている全てのインスタンス変数名を知るには、Javaでは以下のように記述する必要があります。
Some s = new Some(); //あるクラス(Some)のインスタンス生成 Class cls = s.getClass(); //インスタンスからクラスの代理オブジェクト生成 Field[] flds = cls.getDeclaredFields(); //クラスから宣言されたフィールドオブジェクトを取得 String[] names = new String[flds.length]; //名前の文字列の配列を用意 for(int i = 0 ; i<flds.length; i++){ names[i]="flds[i].getName();" //名前を取り出し配列に格納 }
これに対しSmalltalkでは
names := Some allInstVarNames. "クラスに対し直接フィールド名を聞く"
とするのみです。
更に、Someの実行時に生成されている全てのインスタンスを取得するには、
insts := Some allInstances.
と同様に実現できます。Javaでこれを行う場合には、そのままではできず、SomeInstancesといったスタティック変数をSomeに用意し、その変数にSomeインスタンスが生成時に格納されるようにコンストラクタをオーバーライドしなければならないでしょう。
メタ機能実現の容易性により、Smalltalkでは、HVMのM部分をより積極的に使った柔軟なシステムが作りやすくなります。Smalltalk以外の言語を使う開発においても、開発者がメタ機能によりどのような部分が便利になるのかを知っておくことは有益と考えられます。
© 1999-2001 OGIS-RI Co., Ltd. |
|