Fiverwoks Homepageへ

Xoneメタモデル

初版 2004-09-15
沼倉 均
Numakura Hitoshi

■ Xoneメタモデル

Xoneのメタモデルは、AIなどで使われている素性(そせい)構造がベースになっています。素性構造は、個々の素性(属性)を名前・型・値で表します。その素性を複数組み合わせることで、オブジェクトを定義します(C言語の構造体と似ています)。クラスは次のように定義されます。

クラス名
  素性名1,型1,値1
  素性名2,型2,値2
  素性名3,型3,値3
  ...

クラスの素性に値を設定すると、インスタンスを生成するときのデフォルトの値になります。一つのオブジェクト(クラスやインスタンス)のなかでは、素性名はユニークでなければなりません。

たとえばシンプルな従業員というクラスを定義してみると、次のように書けます。
従業員
  名前,string,
  年齢,int,
  住所,string,
  部署,string,

この従業員クラスはいわばテンプレート(概念)ですから、これから実体(インスタンス)を生成します。
EmpID_0001(is_a:従業員)
  名前,string,山田太郎
  年齢,int,29
  住所,string,東京都○×市
  部署,string,営業部

Xoneのメタモデルもこれと同様で、Xoneでは素性ではなくエレメントと呼んでいます。

さて、本物(?)の素性構造では、素性構造の中に素性構造を定義できます。つまり、一つの素性として他の素性構造を階層的に定義できます。

しかし、Xoneではこのような階層的な定義はできません。というのも、確かにこの階層構造によってメタモデルとしての表現力は高まりますが、パフォーマンスが悪くなることとこのモデルを扱うアプリが複雑になってしまうからです(*1)。

*1:文書系ではリカーシブなデータモデルがよく使われます。しかし、これを扱うプログラムは複雑になりがちですから、データ系や情報系で同様のリカーシブなモデルを多用するのは少々アブナイような気がします。

その代わり(というのも変ですが)、Xoneではエレメントのリストを定義することができます。エレメントリストは、名前がユニークであればいくつでも定義できます。このエレメントリストには、いくつでもエレメントを追加することができます。また、リストですからエレメントの名前は同じものでもかまいませんし、登録した順に格納されます。

たとえば、1つの注文データには複数の注文品とその個数が含まれるといったケースがよくありますが、これは次のように表すことができます。
注文クラス
  名前,string,
  送付先,string,
  注文日,date,
  注文品リスト:

ここで、「注文リスト:」がエレメントリストを表します。このインスタンスは、たとえば次のようになります。
OrderID_0001(is_a:注文クラス)
  名前,string,山田太郎
  送付先,string,東京都○×市
  注文日,date,2004-10-10
  注文品リスト:
    品名,string,うな重竹
    個数,int,2
    品名,string,親子丼
    個数,int,3
    品名,string,鉄火丼
    個数,int,1

この例は、RDBのテーブルモデルならば1対多の関係で別のテーブルに格納するところですが、エレメントリストでそれを代用することができます。

■ エレメントの型

エレメントは、名前・型・値で構成されます。値は省略(nullとなる)できますが、名前と型は省略できません。エレメントの型には、組み込みの型(プリミティブ型)とユーザ定義型の2種類あります。

・プリミティブ型
現在のバージョンでは、プリミティブ型には次の14種類あります。これらの型は、com.fiverworks.xone.model.XoneModelに定数として定義されています。また、それぞれ次のようにJavaのクラスに対応します。

プリミティブ型一覧
プリミティブ型定義されている定数Javaクラスとの対応
booleanXoneModel.BOOLEANjava.lang.Boolean
byteXoneModel.BYTEjava.lang.Byte
shortXoneModel.SHORTjava.lang.Short
intXoneModel.INTjava.lang.Integer
longXoneModel.LONGjava.lang.Long
floatXoneModel.FLOATjava.lang.Float
doubleXoneModel.DOUBLEjava.lang.Double
integerXoneModel.INTEGERjava.math.BigInteger
decimalXoneModel.DECIMALjava.math.BigDecimal
stringXoneModel.STRINGjava.lang.String
timeXoneModel.TIMEjava.sql.Time
dateXoneModel.DATEjava.sql.Date
dateTimeまたはtimestampXoneModel.DATE_TIMEまたはXoneModel.TIMESTAMPjava.sql.Timestamp

この型名はXMLSchemaから引用したものですが、日付・時間についてはJavaでもSQLでもTimstampとすることが多いため、dateTimeとtimestampの両方使えるようになっています。また、それぞれの型に[]を付けることで1次元配列を表現できます(ただし、配列は1次元まででそれ以上の次元の配列はありません)。配列も定数で定義されており、それぞれの型の後に_ARRAYを付けます。たとえば、int[]はXoneModel.INT_ARRAYと定義されています。

・ユーザ定義型
プリミティブ型以外の型もユーザが自由に定義できます。ただし、型名は命名規則に従う必要があります。命名規則はJavaの識別子の命名規則と同じです(たとえば先頭を数字で始めることはできない)。型名の後に"[]”を付けると、配列と見なします。

・正しいユーザ定義型の例
“point”
“matrix33[]”
“容積”

・間違った例
“3D”  (先頭が数字なので命名規則違反)
“x-y” (-記号は使えない。命名規則違反)
ユーザ定義型にはクラス名を指定し、その値にはそのクラスのインスタンス名を指定する、といった参照値を使う場面は多々あります。こうした用途に適用できるように、Xoneでは階層的なフォルダによってオブジェクトを管理しています。たとえば、次のようなエレメント
  注文品,root/classes/CPU,root/instances/order_0001
は、名前が注文品、型がroot/classes/CPUというクラス,値がroot/instances/order_0001というインスタンスを示しています。

■ クラス、インスタンス、Anyインスタンス

Xoneのオブジェクトには、クラス、インスタンス、Anyインスタンスの3種類あります。一般のオブジェクト指向と同様にクラスは概念(テンプレート)であり、インスタンスはそれぞれのエレメントの値が定義された実体です。ここで、クラスとインスタンスには次のような関係があります。

  1. インスタンスでは、クラスで定義されたエレメントの値だけを設定・取得できる。
  2. インスタンスでは、クラスで定義されていないエレメントを追加したり、あるいは定義されているエレメントを削除することはできない。
  3. インスタンスでは、クラスで定義されたエレメントリストだけにエレメントを追加したり、削除したりできる。
  4. インスタンスでは、クラスで定義されていないエレメントリストを追加したり、あるいは定義されているエレメントリストを削除することはできない。
上記のような関係があり、インスタンスはクラスがないと作れません。これに対して、Anyインスタンスというのはクラスがなくても作成できるインスタンスです。Anyインスタンスは、形式さえ合っていれば自由にエレメントやエレメントリストを追加したり、更新・削除ができます。つまり、Xoneにおけるクラス、インスタンス、Anyインスタンスは、XMLにおけるスキーマ、そのXMLインスタンス、整形式のXMLインスタンスと対応しています。

Anyインスタンスは、Xoneのシステム内部でもいろいろと便利なためにたくさん使われています。これは、XMLがSGMLに対して「整形式」が使えることが、その普及の一因になったことにつながっているかもしれません。「必ずスキーマが必要」というのは少し窮屈ですから。

以上がXoneのメタモデルのすべてです。

Xoneの設計当初には、メタモデルにももうすこし他の要素があったのですが、シンプルに勝るものはない、というのが紆余曲折を経た(^^;)結論です。また、この程度であればRDBのテーブルモデルにマッピングするときにも容易だろう、という理由もあります。

ただ、将来的にはもっと追加できないかといろいろ考えています。たとえば、もっと「関連」というものを前面に出したメタモデルというのはできないか、とか。皆さんもメタモデルについて何かご意見があればどんどんおよせください。実装することを前提にしないで、気楽に考えてみることから何かよいものが生まれるかもしれませんから...

mailto:hnumakura@fiverworks.com

|ページTOP|ドキュメントTOP|

『Java』は米国および、その他の国における米国Sun Microsystems, Inc.の商標です。
その他本文に記載されている会社名、商品名は、各社の登録商標または商標です。
| 会社案内 | 著作権 | 免責事項 | 通信販売法規に基づく表記 | プライバシーポリシー | お問い合せ | サイトマップ |
COPYRIGHT(C) 2004 Fiverworks Ltd. ALL RIGHTS RESEREVED.