2012年11月30日金曜日

MindmapModeling/SimpleModeler - 状態機械

オブジェクト指向モデリングでは、状態機械(state machine)が動的モデルの核となるモデル要素です。

状態機械はネスト状態をサポートした本格的なものをScala DSLとして組み込み済みです。しかし、Mindmap DSLとSmartDox DSLで定義できるようにはなっていないので、文法の拡張を行ない定義可能にする予定です。

まず、最初のターゲットとしてScala DSLのフルスペックの状態機械ではなく、Javaの属性として変数領域を確保するための情報を定義する範囲でのDSL化を行なっています。

MindmapModeling

状態機械のために、MindmapModelingのトップクラスの枝であるBOI構造枝に「状態機械」を追加しました。各状態機械はこの枝の下に配置します。



以下のようにしてクラス図を生成することができます。

$ sm -diagram statemachine.xmind

このマインドマップから生成されるクラス図です。3つの状態「開始」、「実行中」、「終了」を持つ状態機械「進行」が定義されています。



SmartDox DSL

上のMindmapModeling文法に対応するSmartDox DSLは以下になります。

#+title: 状態機械/StateMachine

* StateMachine

** 進行

#+caption: 状態
| name   |
|--------|
| 開始   |
| 実行中 |
| 終了   |

このDSLから以下のようにしてクラス図を生成することができます。

$ sm -diagram statemachine.org

生成されるクラス図は以下になります。




ノート

状態機械内の状態遷移を記述するSmartDox DSLおよびMindmapModelingの文法は現在検討中です。

最終的には、この状態機械モデルからJavaやScalaプログラムの生成まで行う予定です。

諸元

SimpleModeler Version 0.4.0-RC5-SNAPSHOT (20121126)

SimpleModeler 0.4.0-RC4から少し手を入れたバージョンなので、0.4.0-RC4とは出力されるクラス図が若干異なります。

2012年11月29日木曜日

MindmapModeling/SimpleModeler - 関連クラス

SimpleModelerで扱うメタモデルを設計する上での懸案事項の一つが多対多の関連と関連クラス(association class)の扱いです。

SimpleModeling/MindmapModelingのオブジェクト・モデルの中で多対多の関連や関連クラスをどう扱い、JavaやRDBMSにどうマッピングしていくのかという点は、テキストDSLでの効率的な記述方法の問題と相まって、あまり良い解を思いつきませんでした。

また、多対多の関連や関連クラスはリソースエンティティや普通のエンティティで代替するのが可能なことと、多対多の関連が出てくるところはモデリングを進めると属性を持った普通のクラスに伸びていくことが多いので、それほど強いニーズを感じていなかったということもあります。

ただ、以下の2つのニーズがあることがわかったので関連クラスをサポートすることにしました。

  • 既存のRDBMSのテーブルを扱う場合に、関連クラスを使えると便利
  • オブジェクト側に変更を加えず、ユースケースのニーズに応じて関連を追加できる方法があると便利

多対多の関連は、今のところ直接DSLで記述できるようにする予定はありませんが、関連クラスを使って実現することが可能です。

MindmapModeling

関連クラスは、MindmapModelingのトップクラスの枝であるBOI構造枝に「関連」を追加し、この下に配置します。



以下のようにしてクラス図を生成することができます。

$ sm -diagram associationClass.xmind

このマインドマップから生成されるクラス図です。トレイト・クラスが一つ定義されています。



SmartDox DSL

上のMindmapModeling文法に対応するSmartDox DSLは以下になります。

#+title: 関連クラス/Association Class

* 道具

** ブログ

** タグ

* 関連

** ブログタグ対応

#+caption: 関連
| 名前   | 型     | 多重度 |
|--------+--------+--------|
| ブログ | ブログ | *      |
| タグ   | タグ   | *      |

一点だけ、データ型を指定しているところが異なります。

このDSLから以下のようにしてクラス図を生成することができます。

$ sm -diagram associationClass.org

このマインドマップから生成されるクラス図です。トレイト・クラスが一つ定義されています。



この場合はデータ型をDSLで指定しているので、その指定もクラス図に反映されています。

諸元

SimpleModeler Version 0.4.0-RC5-SNAPSHOT (20121129)

SimpleModeler 0.4.0-RC4から少し手を入れたバージョンなので、0.4.0-RC4とは出力されるクラス図が若干異なります。

2012年11月28日水曜日

MindmapModeling/SimpleModeler - トレイトの使用方法

昨日「MindmapModeling/SimpleModeler - トレイト」のトレイトを実際に使う場合の文法について説明します。

MindmapModelingの使い方は以下になります。

このモデルでは「特色」(トレイト)として以下のものを定義しています。

  • タグ付け可能
  • 画像貼付け可能

そして、この2つのトレイトをミックスインした道具(resouce entity)「ブログ記事」を定義しています。「ブログ記事」の構造枝「特色」の下に2つの特色「タグ付け可能」と「画像貼付け可能」を配置しています。このことによって「ブログ記事」に「タグ付け可能」と「画像貼付け可能」がミックスインされます。




このマインドマップモデルから以下のようにしてクラス図を生成することができます。

$ sm -diagram trait.xmind

生成されたクラス図は以下になります。2つのトレイト「タグ付け可能」と「画像貼付け可能」が定義されており、リソース「ブログ記事」がこの2つのトレイトをミックスインしています。




Java

SimpleModelerでは「トレイト・モデリング」で説明したモデリングのトレイトのJavaマッピングをサポートしています。

先ほどのMindmapModelingのモデルから以下のようにしてJavaプログラムを生成します。

$ sm -java trait.xmind

Javaにはトレイトがないので、インタフェースとして生成されます。トレイト「タグ付け可能」に対応するインタフェース(の先頭部分)は以下のものになります。

public interface タグ付け可能 {
    public static final String PROPERTY_タグ = "タグ";
    public String getタグ();
    public void setタグ(String タグ);
}

リソース「ブログ記事」に対応するJavaクラス「ブログ記事」(の先頭部分)は以下のものになります。

@Entity
public class ブログ記事 implements タグ付け可能, 画像貼付け可能 {
    public static final String PROPERTY_ID = "id";
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;
    @Basic(fetch=FetchType.EAGER)
    @Column(nullable=false)
    protected String タグ;
    @Basic(fetch=FetchType.EAGER)
    @Column(nullable=false)
    protected String リンク;

トレイトの実装部がクラスの中に埋め込まれるのと同時に、インタフェース「タグ付け可能」と「画像貼付け可能」がインプリメントされています。このことによって、事実上トレイトをミックスインしたクラスとして使用することができるわけです。

SmartDox DSL

上のMindmapModeling文法に対応するSmartDox DSLは以下になります。一点だけ、データ型を指定しているところが異なります。

#+title: 特色/Trait

* 特色

** タグ付け可能

#+caption: 属性
| name | type  |
|------+-------|
| タグ | token |

** 画像貼付け可能

#+caption: 属性
| name   | type |
|--------+------|
| リンク | link |

* 道具

** ブログ記事

#+caption: 性質一覧
| 項目 | 値                          |
|------+-----------------------------|
| 特色 | タグ付け可能,画像貼付け可能 |

#+caption: 属性
| name     | type   |
|----------+--------|
| タイトル | string |
| 内容     | text   |

このDSLから以下のようにしてクラス図を生成することができます。

$ sm -diagram trait.org

このSmartDox DSLから生成されるクラス図は以下になります。




諸元

  • SimpleModeler Version 0.4.0-RC5-SNAPSHOT (20121127)

SimpleModeler 0.4.0-RC4から少し手を入れたバージョンなので、0.4.0-RC4とは出力されるクラス図が若干異なります。

2012年11月27日火曜日

MindmapModeling/SimpleModeler - トレイト

トレイト・モデリング」でも取り上げたトレイトは、プログラミングのみならずモデリングでも非常に有効です。
このトレイトをSimpleModelerに組み込んでみました。
これに関連して、MindmapModelingではあまり使う機会はありませんが一応文法としても定義しています。トレイト(trait)はマインドマップ的には「特色」という用語を当てています。

以下のようにしてクラス図を生成することができます。
$ sm -diagram trait.xmind
このマインドマップから生成されるクラス図です。トレイト・クラスが一つ定義されています。



SmartDox DSL

上のMindmapModeling文法に対応するSmartDox DSLは以下になります。
#+title: 特色/Trait

* Trait

** タグ付け可能

#+caption: 属性
| name | type  |
|------+-------|
| タグ | token |
一点だけ、データ型を指定しているところが異なります。
このDSLから以下のようにしてクラス図を生成することができます。
$ sm -diagram trait.org
このマインドマップから生成されるクラス図です。トレイト・クラスが一つ定義されています。


この場合はデータ型をDSLで指定しているので、その指定もクラス図に反映されています。

諸元

SimpleModeler Version 0.4.0-RC5-SNAPSHOT (20121126)
SimpleModeler 0.4.0-RC4から少し手を入れたバージョンなので、0.4.0-RC4とは出力されるクラス図が若干異なります。

2012年11月26日月曜日

MindmapModeling/SimpleModeler - 要約の文法

MindmapModeling/SimpleModeler - 要約」で導入した「要約(summary)」のMindmapModelingの文法は以下になります。


以下のようにしてクラス図を生成することができます。
$ sm -diagram summary.xmind
このマインドマップから生成されるクラス図です。要約クラスが一つ定義されています。

SmartDox DSL

上のMindmapModeling文法に対応するSmartDox DSLは以下になります。
#+title: 要約/Summary

* Summary

** ランキング

#+caption: 属性
| name | type  |
|------+-------|
| 名前 | token |
| 得点 | int   |
一点だけ、データ型をしているところが異なります。
このDSLから以下のようにしてクラス図を生成することができます。
$ sm -diagram summary.org
このマインドマップから生成されるクラス図です。要約クラスが一つ定義されています。




この場合はデータ型をDSLで指定しているので、その指定もクラス図に反映されています。

諸元

SimpleModeler Version 0.4.0-RC5-SNAPSHOT (20121126)
SimpleModeler 0.4.0-RC4から少し手を入れたバージョンなので、0.4.0-RC4とは出力されるクラス図が若干異なります。

2012年11月22日木曜日

MindmapModeling/SimpleModeler - 要約

MindmapModeling「1回のメール配信で売り上げ数千万アップの驚異」」で、MindmapModelingの文法を拡張中であることを説明しました。正確にはSimpleModelingのメタモデルの拡張を行い、MindmapModelingの文法への反映と、SimpleModelerでの実装を行いました。

その文法拡張の一つが「要約(summary)」です。

summaryテーブルという考え方自体は昔からデータモデリングで使われていますし、「上流工程UMLモデリング」でもモデル要素としてはあげていました。これを第一級のモデル要素としてMindmapModelingやSimpleModelerで意識して扱うのが妥当かどうかという点が長年の懸案事項でした。

「要約」はクラウド・アプリで必須、という結論を出したのが昨年末になりますが、やっと実装することができました。

関連する記事:

とはいえ、今回はMindmapModelingに「要約」のBOI構造枝を追加したのと、SimpleModelerで扱えるようにするところまでです。

「要約」のあるところデータフローあり。「要約」データは、オンラインからのSQLの問合せでは実用的な応答速度を出せないような大規模演算が後ろに控えているのが普通です。この実装はバッチ処理になります。このバッチ処理の設計と実装にはデータフローが有効です。

データフローの記述方法をどうするのかというのが、これまた懸案事項だったのですが、この基本的なアイデアを思いついたのが、今回MindmapModeling/SimpleModelerに「要約」を入れることにした直接の動機になっています。

こちらは実装にもう少し時間がかかりそうですが、ある程度形が見えてきたらブログで紹介したいと思います。

2012年11月21日水曜日

SimpleModeler 0.4.0-RC4

モデルコンパイラSimpleModeler 0.4.0-RC4をリリースしました。

これは、11月17日に開催した横浜モデリング勉強会の前後に拡張した機能をまとめたものです。

マインドマップ(XMind)、SmartDox DSL、CSVからクラス図とJavaプログラムを生成する機能が実用フェーズとなっています。

また、扱えるメタモデルにいくつか拡張を行いました。ブログで紹介していく予定です。

0.4.0正式版はバグフィックスおよび新機能の動作確認が取れた後リリース予定です。

機能

Simplemodeler 0.4.0-RC4では以下のオプションを提供しています。

オプション機能状況
projectプロジェクト生成α
importモデル移入α
convertモデル変換試験的
html仕様書生成α
javaJava生成
androidAndroid生成α
diagramクラス図生成
buildプロジェクトビルド試験的
gaejGoogle App Engine Java生成試験的
gaeGoogle App Engine Python生成試験的
gaeoGoogle App Engine Oil生成削除予定
grailsGrails生成試験的
g3g3生成試験的
asakusaAsakusa生成試験的

基本的にはマインドマップ(XMind)、SmartDox DSLとCSVからクラス図とJavaプログラムを生成する処理が実用フェーズになっています。その他の機能はα版または試験的実装の状態です。

インストール

プログラムの配布は、Scala用のプログラム配布ツールconscriptを使っています。

conscriptをインストールした後、以下のようにしてSimpleModelerをインストールします。

$ cs asami/simplemodeler

以下のコマンドがインストールされます。

sm
SimpleModelerコマンド
$ sm -version
Copyright(c) 2008-2012 ASAMI, Tomoharu. All rights reserved.
SimpleModeler Version 0.4.0-RC4 (20121121)
graphviz

-diagramオプションでクラス図を生成する場合は、graphvizのインストールが必要です。graphvizのインストール方法は以下を参照してください。

各プラットフォーム向けパッケージ管理ツールでもインストールできるようです。

Mac
http://www.macports.org/
Windows
http://sourceware.org/cygwinports/

使い方

マニュアルはまだありません。以前のバージョン用のものがありますが、機能が色々変わってしまったので一から見直す予定です。

リファレンスマニュアルとユーザーガイドの元ネタをこのブログで随時書いていきます。

CSV

Mind(マインドマップ)、SmartDox DSL、CSVからクラス図を生成することができます。

以下のCSVファイルをsample.csvとして用意します。

#actor,base
顧客
個人顧客,顧客
法人顧客,顧客
#resource,attrs,powers
商品,商品名;定価(long),商品区分(第1類;第2類;第3類)
#event,parts
購入する,顧客;商品

SimpleModelerを以下のように実行します。

$ sm -diagram sample.csv

以下のクラス図の画像が生成されます。

SmartDox

以下のSmartDoxファイルをsample.orgとして用意します。

#+title: Table

SmartDox DSLを使って記述したモデルの
サンプル文書です。

文書でサンプルモデルの定義をします。
本来は文書中の仕様記述の文書は
定義するモデルに対するものになります。

しかし、この文書ではSmartDox DSLの記述例として
SmartDox DSL文法の説明を記述することにします。

* サンプル文書の目的

このサンプル文書は表を中心にしてクラス定義するサンプルです。

登場人物、道具、出来事の各エンティティの種別の下に
顧客、商品、購入といった具象エンティティを節として
定義します。

そして、それらの節の下に属性一覧または特性一覧として
エンティティの属性や関連を記述していきます。

* 登場人物

** 顧客

IDの指定はありませんが、以下のルールで推測しています。

- 陽にID指定がない場合、先頭の属性の属性名が「id」(大文字可)で終わる場合はIDとみなす。

#+caption: 属性一覧
| 名前   | 型     | カラム  | SQL型        |
|--------+--------+---------+--------------|
| 顧客ID | token  | ID      | CHAR(16)     |
| 名前   | token  | NAME    | VARCHAR(64)  |
| 住所   | string | ADDRESS | VARCHAR(256) |

* 道具

** 商品

IDは、ID欄で指定しています。

#+caption: 属性一覧
| 名前   | 型    | ID | カラム | SQL型       |
|--------+-------+----+--------+-------------|
| 商品ID | token | ○ | ID     | CHAR(16)    |
| 名前   | token |    | NAME   | VARCHAR(32) |
| 定価   | money |    | PRICE  | LONG        |

* 出来事

** 購入

IDは、特性欄で指定しています。

#+caption: 特性一覧
| 特性 | 名前   | 型    | 多重度 | 派生        | カラム      | SQL型    |
|------+--------+-------+--------+-------------+-------------+----------|
| ID   | 購入ID | token |        |             | ID          | CHAR(16) |
| 属性 | 日付   | date  |        |             | DATE        | DATE     |
| 関連 | 顧客   | 顧客  |      1 |             | CUSTOMER_ID | CHAR(16) |
| 属性 | 顧客名 | token |        | 顧客.名前   |             |          |
| 関連 | 商品   | 商品  |      1 |             | GOOD_ID     | CHAR(16) |
| 属性 | 数量   | int   |        |             | AMOUNT      | INT      |
| 属性 | 商品名 | token |        | 商品.名前   |             |          |
| 属性 | 単価   | money |        | 商品.定価   |             |          |
| 属性 | 総額   | money |        | 数量 * 単価 |             |          |

SimpleModelerを以下のように実行します。

$ sm -diagram sample.org

以下のクラス図の画像が生成されます。