前前回の記事ではModegrammingをキーワードにしたモデル駆動開発向けに開発している5つのプロダクトについて説明しました。
- SmartDox
- 文書処理系
- SimpleModeler
- モデルコンパイラ
- Kaleidox
- アクション言語
- Arcadia
- Webフレームワーク
- Prefer Cloud Platform
- クラウド・アプリケーション・プラットフォーム
今回はSimpleModelerについて紹介します。
SimpleModeler
SimpleModelerはモデルからプログラムなどの成果物を生成するモデルコンパイラです。
SimpleModelerはSimpleModel形式で記述されたモデルを入力し、JavaやScalaのプログラムを始め各種生成物を生成します。
モデル
SimpleModelerはSmartDox形式の文書として記述したSimpleModelを入力とします。SmartDox形式はざっくりEmacs org形式とMarkdown形式を折衷した形式です。
SimpleModelは、現在、静的構造モデル(UMLではクラス図、パッケージ図など)とユースケースモデルを記述することができます。この中でユースケースモデルと静的構造モデルはモデル検証用に、静的構造モデルはプログラムの生成に使用します。
静的構造モデルでは以下のような種類のオブジェクトをステレオタイプとして定義しています。
- Resource
- リソース
- Event
- イベント
- Actor
- アクター
- Role
- ロール
- Voucher
- バウチャー
- Powertype
- パワータイプ
これらのオブジェクトを適材適所で使用してモデルを記述することで、モデルの精度や情報量も高まり、より適切なプログラムの生成につなげることができます。
今回はシンプルにResourceのみを定義したモデルを使います。
- #+title: サンプル
- * Resource
- サンプルモデルのリソースです。
- PersonとAddressを定義しています。
- ** Person
- #+caption: 特性一覧
- | 特性 | 名前 | 型 | 多重度 | ラベル | カラム | データ型 | 備考 |
- |------+---------+---------+--------+--------+--------+----------+------|
- | 属性 | name | token | 1 | | | | |
- | 関連 | address | Address | 1 | | | | |
- 利用者です。
- 住所を記述するAddressへの関連を持っています。
- ** Address
- #+caption: 特性一覧
- | 特性 | 名前 | 型 | 多重度 | ラベル | カラム | データ型 | 備考 |
- |------+------+-------+--------+--------+--------+----------+------|
- | 属性 | zip | token | ? | | | | |
- 住所です。
ここではEmacsでの編集が楽なorg形式の文法を使用して記述しています。
このモデルではリソースPersonとAddressを定義しています。
まず「* Resource」で以下のクラス定義がリソースであることを示しています。
つぎに段落を一つ下げた「* Person」、「* Address」でそれぞれPersonとAddressを定義してます。Personは利用者、Addressは住所を記述するためのリソースです。
オブジェクトの属性や関連は「特性一覧」の表で定義しています。
段落と表以外はモデルとして認識しないので、モデルの説明などの文章を自由に書くことができます。
このモデルをsample.orgというファイルに格納します。
生成
前出のサンプルから各種成果物を生成することができます。
Java
SimpleModelを格納したsample.orgを引数にsmコマンドを起動します。
第1引数にjavaを指定するとJavaプログラムを生成します。
$ sm java sample.org
以下のようなJavaプログラムが生成されます。
- import java.math.*;
- import java.util.*;
- import org.json.*;
- import org.simplemodeling.SimpleModeler.runtime.USimpleModeler;
- public class Person {
- public static final String PROPERTY_NAME = "name";
- protected String name;
- protected Adress address;
- public Person() {
- }
- public Person(Person o) {
- this.name = o.name;
- this.address = o.address;
- }
- public Person(String name, Adress address) {
- this.name = name;
- this.address = address;
- }
- public Person(PersonVoucher o) {
- this.name = o.name;
- this.address = o.address;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public Adress getAddress() {
- return address;
- }
- public void setAddress(Adress address) {
- this.address = address;
- }
- public Person withName(String name) {
- this.name = name;
- return this;
- }
- public Person withAddress(Adress address) {
- this.address = address;
- return this;
- }
- }
Scala
smコマンドの第1引数にscalaを指定するとScalaプログラムを生成します。
$ sm scala sample.org
以下のようなScalaプログラムが生成されます。
- class Person(var name: String) {
- private String name;
- def public String getName() = {
- return name;
- }
- def public void setName(String name) = {
- this.name = name;
- }
- def public Person withName(String name) = {
- this.name = name;
- return this;
- }
- }
まとめ
今回はSimpleModelerについて説明しました。
次回は、SimpleModelerの扱うオブジェクトメタモデルSimpleModelについて説明します。