2011年4月8日金曜日

メタモデルとステレオタイプ

PIM段階のドメインモデルで、自前管理のオブジェクトと他サービス管理のオブジェクトの区別をするのか、その区別はPSM段階まで留保しておくのか。
一意的に決めてしまうのは難しい問題で、ケースバイケースで選択したいところです。短手番でサービスをマッシュアップしてアプリケーションを構築する用途では前者のニーズが高そうですし、長期間にわたって持続的にシステム構築を続けていく、基幹システムでは後者のニーズが高いでしょう。
SimpleModelingは、どちらかというと前者の用途をターゲットにしているので、前者向けに特化したメタモデルを整備しても良いのですが、場合によっては後者の応用にも対応できるのに越したことはありません。
そういったことをつらつらと考えている中で、思いついたのは以下の図のメタモデルです。



以下のメタオブジェクトが定義されています。

Entity
アプリケーションが永続的に使用するオブジェクト
DomainResource
Resourceタイプのドメインオブジェクト
ManagedEntity
アプリケーションの管理下にあるEntity
ServiceEntity
他サービスの管理下にあるEntity
ManagedDomainResource
アプリケーションの管理下にあるDomainResource
ServiceDomainResource
他サービスの管理下にあるDomainResource
ServiceResource
ServiceDomainResourceの別名

EntityとDomainResourceが元々あったメタオブジェクト。SimpleModelingのメタオブジェクト全体でアプリケーションが永続的に使用するオブジェクトがEntity。Entityの一種でドメインモデルのリソースオブジェクトがDomainResourceとなります。
ManagedEntityとServiceEntityは、EntityにミックスインしてEntityの所属を記述するために追加したメタオブジェクトです。
そして、DomainResourceかつManagedEntityなドメインオブジェクトがManagedDomainResource、DomainResourceかつServiceEntityなドメインオブジェクトがServiceDomainResourceです。
さらに、ServiceDomainResourceの別名としてServiceResourceを用意します。
このメタモデルをステレオタイプで表現したクラス図表現は以下のようになります。


このステレオタイプの使用方法は以下の2パターンを念頭においています。

  1. DomainResourceはManagedDomainResourceの省略形として用い、ServiceResourceと組合せて使うことで、PIM段階で自前エンティティと他サービスエンティティを区別しながらモデリングを行う。
  2. PIM段階ではDomainResourceとしておき、PSM段階でManagedEntityやServiceEntityを追加し定義して、自前エンティティと他サービスエンティティを区別する。
具体例でみていきましょう。
(1)ServiceResourceを使う場合は以下のようになります。DomainResourceと同様に拡張を行ったDomainEventも使用しています。Tweet発生にはタグ付き値にservice=twitterを定義して、TwitterによるTweet発生であることを記述しています。(ボクが使っているJudeではタグ付き値がクラスシンボルに表示されないようなので、コメントで定義しています。)


次は、(2)ManagedEntity/ServiceEntityを使う場合です。
まず、PIM段階では以下のようにDomainResourceやDomainEventを使用していきます。具体的な実現方法はここでは記述しません。



これをPSM段階で具体的なサービスの活用を加えたものが以下のものです。Tweet発生にServiceEntityを加え、タスク起票タスクにManagedEntityを加えています。また、Tweet発生にはタグ付き値にservice=twitterを定義して、TwitterによるTweet発生であることを記述しています。


この例はTwitterのツイートの取り込みを念頭においているものなので、「(1)ServiceResourceを使う」のが適している感じです。
もちろん、アプリケーションの構想段階でドメインオブジェクトのどの部分を外部サービスのものを借りてくるか未定の場合には「(2)ManagedEntity/ServiceEntityを使う」記述方法が適しているでしょう。

0 件のコメント:

コメントを投稿