2009年6月12日金曜日

GMEメタモデリングコンセプト:Model and Atom

前回ご紹介したように、GMEでは、ユーザがメタモデルを定義すると、コードを一切生成することなくそのインスタンスモデルのグラフィカルエディタを提供します。そのため、GMEのM2モデル実装はインスタンスモデルのグラフィカルエディタの視覚効果に密接に関連しています。言い換えると、純粋なUMLベースのメタモデリングとはかなり異なるコンセプトが多く導入されており、賛否両論ではないかと想像します。

3種類のクラス
GMEのM2モデル実装には、以下の3種類のクラスが存在します。
  1. FCO(First Class Object)
  2. Model
  3. Atom(Atomic Object)
上記のうち、「FCO」は特殊な抽象クラスで、上記ModelやAtom以外の要素の親クラスにもなり得る、「なんでも親クラス」です。後日、ModelおよびAtom以外の要素についてご紹介しようと思っているので、FCOのご紹介はその後にしたいと思います。

「Model」は、UMLにおけるいわゆるクラスです。属性を持つことができますし、抽象クラスになることもできます。他のModelやAtomをコンポジション参照することにより、それらのインスタンスをモデルツリー上の子供にすることができます。

「Atom」もクラスの一種で、属性を持つことができますし、抽象クラスになることもできます。一方、上記Modelと異なるのは、ModelやAtomといった他の要素をコンポジション参照することができません。つまり、インスタンスのモデルツリー上では「葉」に相当するわけです。

グラフィカルエディタ上でのModelとAtomの違い
以下のメタモデルを例に、インスタンスモデルのグラフィカルエディタ上でのModelとAtomの違いを説明したいと思います。以下のメタモデルはModelおよびAtomのみを使った「ファイルシステム」メタモデルです。「FileSystem」オブジェクトは一つの"root"Folderオブジェクトを包含し、「Folder」オブジェクトは、「Folder」または「File」オブジェクトを複数包含することができる、コンポジットパターンです。
ユーザがメタモデルを完成させると、それを「Paradigm」としてGMEに登録します。すると、そのインスタンスモデルのグラフィカルエディタが利用可能になります。以下が、そのグラフィカルエディタの例です。
上記スクリーンショットでまずわかるのが、ModelとAtomで、デフォルトのアイコンが異なります。Modelのアイコンは灰色の大きな四角、Atomは青色の小さな四角になります。
そして、大きく異なるのが、それらのエディタ上での挙動で、Modelのアイコンをダブルクリックすると中央のエディタ領域が更新し、そのModelオブジェクトの子オブジェクト群が表示されます。例えば上記スクリーンショットは、"root"Folderオブジェクトの子オブジェクト群が表示されており、上記パレットから新たにFolderオブジェクトまたはFileオブジェクトをドラッグアンドドロップで追加できます。
一方、Atomoのアイコンをダブルクリックしても何も起こりません。なぜなら、Atomオブジェクトはモデルツリー上における「葉」であって、子オブジェクトを包含することができないからです。

インヘリタンスツリーの設計が紛らわしい
メタモデル上において、Atomを親クラスとして継承するModelを定義することができます(またはその逆も可能)。この点において、ModelもAtomも基本的にはクラスであることが再認識できます。一方、上記エディタ上での振る舞いの違いを理解した段階では、このインヘリタンスは混乱を招きかねないので、注意が必要です。

0 件のコメント: