simplemodeler

68
クラウド・アプリケーション DSL駆動アプローチ SimpleModelerの試み 浅海智晴 edge2.cc 2010122

Upload: tomoharu-asami

Post on 31-May-2015

2.714 views

Category:

Technology


0 download

DESCRIPTION

AppEngine Ja Night #4 at Ginza

TRANSCRIPT

Page 1: SimpleModeler

クラウド・アプリケーションDSL駆動アプローチSimpleModelerの試み

浅海智晴

edge2.cc2010年1月22日

Page 2: SimpleModeler

話題

SimpleModeler(+edge2.cc)でAppEngine Javaプログラム自動生成を作っていて考えたこと

クラウド・アプリケーション・アーキテクチャ

オブジェクト・モデリングとクラウド・アプリケーション

DSL駆動開発とクラウド・アプリケーション

Page 3: SimpleModeler

内容

SimpleModelerDSL駆動開発

SimpleModler&AppEngine

Page 4: SimpleModeler

SimpleModeler

Page 5: SimpleModeler

Agile Modegramming for Cloud

アジャイル開発

オブジェクトモデリング

クラウドプラットフォーム

モデル駆動開発テキストDSL

モデルコンパイラ

Agile Modegrammingfor Cloud

Page 6: SimpleModeler

SimpleModeler

SimpleModel用モデル・コンパイラ

テキストDSLScala DSLScala DSL&mavenによるモデル・リポジトリ

Web仕様書、Java、Grails、Google App Engine Python/Javaを生成

Page 7: SimpleModeler

Java .NET LAMP

Cloud AppEngine/Java Windows Azure AppFabric

AppEngine/Python

Web Spring, Seaser, Grails

Windows Server AppFabric

PHP, Ruby on Rails, Python Django

Enterprise JavaEE(SOA) Windows Server AppFabric

N/A

ターゲットのプラットフォーム

Page 8: SimpleModeler

SimpleModelerの動作

企画中

CSV

Mindmap(Xmind)

SimpleModelリポジトリ(Maven project)

Web仕様書

クラス図

Javaプログラム

Grailsプログラム

convert

import

import

html

java

grails

project

Scala DSL

Excel

import

検証結果

verify

ステートマシーン図

Google App Engine/Pythonプログラム

Google App Engine Oilプログラム

gae

gaeo

テストセット

testset

Google App Engine/Javaプログラム

gaej

Page 9: SimpleModeler

SimpleModelerが生成するコード

index.jsp DEACustomerController

DSYorozuEntityRepositoryService

GwtYorozuEntityRepositoryServiceImpl

index.jspindex.jsp

index.jsp

index.html

GWTCustomerEditor

Dojoウィジェット

DataStore

GwtCustomer

<<document>>DDCustomer

HTML Form

GWT-RPC

Servlet

JSP

AtomYorozuDomainRepositoryServiceServlet

Atomクライアント

RESTYorozuDomainRepositoryServiceServlet

Webブラウザ(JavaScript)

Servlet

Servlet

Servlet

Atom

AtomPub

HTML FormJSON

JDO

<<entity>>DEACustomer

JDO

REST

AtomPub

GWT

Web Controller/Action/Template

EntityRepositoryService

Page 10: SimpleModeler

Scalaについて

純粋オブジェクト指向言語+本格関数型言語関数型言語とクラウドは相性がよいはず

静的型付+型推論

Java VM上で動作

言語仕様が複雑その代わり浅海の体感ではJavaの3倍ぐらいの生産性がある

DSLのホスト言語として充実した機能を持っている

モデル・コンパイラの実装言語として充実した機能を持っている

Page 11: SimpleModeler

ScalaSimpleModelerで使用

内部DSL・外部DSL

XtextEclipse Modeling Framework外部DSLWebSphereと近しい関係にあると思われる

OsloWindows SQL Server Modeling外部DSLAppFabricと統合されている

当面はScalaを使用

状況によってXtextまたはOsloに移行

するかもしれない

DSLプラットフォーム

Page 12: SimpleModeler

DSL駆動開発

Page 13: SimpleModeler

DSL駆動開発とは

テキストDSLを用いたモデル駆動開発UMLをプログラミング言語的に用いることは間違いだった!?

テキストDSLでモデルを記述

作成効率はテキストが圧倒的に効率的

必要に応じてUMLの図を生成モデルの視認性はUMLが上

テキストDSLの実現方法内部DSL:ホスト言語上に構築

外部DSL:スクラッチで言語を作成

モデルをデータとして操作して成果物を生成する

モデルをテキストで記述する

Page 14: SimpleModeler

PIM/PSM/実装

実装、 、(Java XML …)

PSM

PIM

非機能要求 プラットフォーム

CIM

CIM : Computer Independent ModelPIM : Platform Independent ModelPSM : Platform Specific ModelDSL: Domain Specific Language

DSL

DSL

Page 15: SimpleModeler

モデル駆動開発&コンポーネント

OO分析

DSL

DSL

OO設計 OO実装

DSL

OO設計 OO実装

コンポーネント

コンポーネント

コンポーネント

コンポーネント

コンポーネント

自動生成

自動生成

自動生成

OO分析

分析 設計 実装

Page 16: SimpleModeler

フレームワーク vs 自動生成

Google App Engine

フレームワーク

定義ファイル

アプリケーション

Google App Engine

フレームワーク

定義ファイル

アプリケーション

アプリケーション

フレームワークアプローチ

自動生成アプローチ

DSL

自動生成

Page 17: SimpleModeler

DSL駆動開発で達成したいこと(1)

プログラムの自動生成

契約

コンポーネントの自動生成

雛形の自動生成

One Source Multi Use (OSMU)AppEngine, Azure, JavaEE(SOA)

モデルの再利用

アーキタイプ

Page 18: SimpleModeler

DSL駆動開発で達成したいこと(2)

モデルの見える化仕様書自動生成マルチ・ビュー自動生成追跡性(tracability)

このユースケースで更新しているエンティティは何かこのエンティティを更新しているユースケースは何か

メトリクスモデル検証テスト

ユースケース→テスト・シナリオ契約→コンポーネント・テスト

プロジェクト管理の土台ユースケース駆動見積もり

Page 19: SimpleModeler

考えないといけないこと

現実世界(ドメイン・モデル)

やりたいこと(ユースケース・モデル)

アーキテクチャ

データ

サービス

UI

インテグレーション

イベント/リアクティブ

サービス・バス

開発( + 変換 プログラミング)

クラウド・アプリケーションも記述できるPIM

クラウド・アプリケーションのアーキテクチャ・要素技術

クラウド・アプリケーションの開発手法クラウドアプリケーションに

対応した問題空間PIMクラウドアプリケーション開発手法

クラウドアプリケーション解決空間PIM

クラウドアプリケーションPSMPIM(Platform Independent Model)

PSM(Platform Specific Model)

Page 20: SimpleModeler

クラウド・アプリケーション・アーキテクチャ論理層の観点から

プレゼンテーション層

サーバ側クラウド・アプリケーション

統合層

サービス

サービス

KVS

RDBMS

メッセージ・キュー

:アクセス方式4 手続き呼出し、性能特性 障害特性がローカル

。の手続き呼び出しよりも脆弱

:アクセス方式5 メッセージング。分散環境での連携に適応する特性をもつ

:アクセス方式2 KVS。一般のデータはKVSに格納するのが望ましい

アクセス方式3:RESTWebページを手繰って情報を取得する

アクセス方式1: RDBMSACID特性を要求されるデータはRDBMSに

。格納する

サービス

ドメイン層

ビジネス層

プレゼンテーション層

REST

統合層

アプリケーションの論理的な構成は従来のものと変わらない

クライアント側

HTML5

サービス

クライアントはWebブラウザ上で動作するHTML5で本格的なGUI

。を構築する

プレゼンテーション層はWeb指、向のMVC2ではなく クライアント

。/サーバ時代のGUIに回帰する

、サーバ側では GUIが使用する。サービスを提供する

Page 21: SimpleModeler

クラウド・アプリケーション・アーキテクチャの例

クラウド・アプリケーション

サービス

メッセージ・キュー

サービス

メッセージ・キュー

プレゼンテーション

サービス

サービス

REST

サービス

KVS

マスターデータなど更新頻度が低いデータは。KVSで配布して直接参照する

バックエンドのサービス群もメッセージによ。って連携

、結果を直接知りたい場合には 手続き呼。び出しで同期型の連携を行う

この形式の連携を行うとスケーラビリティが。低くなる

プレゼンテーションの段階でできることをや、っておくと スケールアウトの効果によって

。スケーラビリティが高まる 外部サービスからRESTを用いて情報を取

。得するのが典型的な利用方法

KVSデータベースをアクセスするスコープは

。サービスに閉じておくのがよい

。サービス利用の主力はメッセージである この形式の連携を行うとスケールアウトに

。よってスケーラビリティを確保できる

メッセージ送信

同期通信

メッセージ配信

RDBMS

。KVSとRDBMSを適材適所で使い分ける 。可能であればKVSを使うのが望ましい

Page 22: SimpleModeler

想定アーキテクチャ(最近考えていること)

Service Bus

Integration Framework

ServiceWeb GUI(HTML5)

Component

Reactive Framework

UI FacadeService

Page 23: SimpleModeler

SimpleModelingの本

Page 24: SimpleModeler

オブジェクト・モデルの構成状態機械モデル

静的構造モデル協調モデル

ユースケース(利用事例)

ユースケース図 コミュニケーション図

シーケンス図

ステートマシーン図

クラス図をインスタンス化(実体化)したものがオブジェクト図

ユースケースを現実化したものがコミュニケーショ、ン図/シーケンス図 コミュニケーション図/シーケン

ス図を利用者の視点によるシステムの利用事例として抽象化したものがユースケース

コミュニケーション図を時間軸の側面から記述したもの

がシーケンス図オブジェクト図上でコラボレーション(メッセージの送受信の集まり)を記述したものがコミュニケーション図

オブジェクト図/クラス、図 コミュニケーション

図/シーケンス図に登場するオブジェクトの状態遷移を記述

オブジェクト図

クラス図

Page 25: SimpleModeler

SimpleModeling全体像

自然言語

オブジェクト・モデル

静的モデル

ドメイン・モデル 要求モデル システム・モデル

動的モデル

動的モデル

静的モデル

同期

変換

変換静的モデル

利用

用語

ユースケース

コラボレーション

クラス図

静的モデル 静的モデル

具体化

操作

操作

動的モデル

静的モデル具体化

クラス図

クラス図 クラス図

クラス図

コラボレーション

設計モデル

事実

アプリケーション・モデル

ドメイン・モデル

契約

動的モデル

宣言モデル

規則

OCL OCL

具体

ルール・モデル

契約

同期

変換

拡張

機能モデル 変換

宣言モデル

ビジネス・ルール

拡張

宣言モデル

ビジネス・ルール

サービス契約

データフロー図

OCL

Page 26: SimpleModeler

SimpleModelingモデル変換

ユースケース

具体化

具体化

詳細化

静的構造 エンティティ ドメイン層

データベース

格納

やりたいこと

ドメイン・モデル 要求モデル システム・モデル 設計モデル 実装

ドメイン層

アプリケーション層

プレゼンテーション層

実現

操作

エンド・ユーザ

具体化

コントロール

バウンダリ

ボキャブラリ

文脈

プレゼンテーション層

アプリケーション層

現実世界

動的モデル

業務モデル

抽出

抽出

利用事例

ドメイン・モデル

アプリケーション・モデル

Page 27: SimpleModeler

クラウドの要件とモデリング技法

エンティティ・モデル

ユースケース・モデル

データベース選択

データ分割

アクセス法解析

データ種別

責務抽出

サービス分割

非同期処理 コラボレーション

顧客要求

Page 28: SimpleModeler

SimpleModelerでの対応方針状態機械モデル

静的構造モデル協調モデル

ユースケース(利用事例)

ユースケース図 コミュニケーション図

シーケンス図

ステートマシーン図

クラス図をインスタンス化(実体化)したものがオブジェクト図

ユースケースを現実化したものがコミュニケーショ、ン図/シーケンス図 コミュニケーション図/シーケン

ス図を利用者の視点によるシステムの利用事例として抽象化したものがユースケース

コミュニケーション図を時間軸の側面から記述したもの

がシーケンス図オブジェクト図上でコラボレーション(メッセージの送受信の集まり)を記述したものがコミュニケーション図

オブジェクト図/クラス、図 コミュニケーション

図/シーケンス図に登場するオブジェクトの状態遷移を記述

オブジェクト図

クラス図

DSLで記述。自動生成。

DSLで記述。自動生成。

ユースケース、サービスをDSLで記述。

ユースケースからサービスまではモデル検証。サービス契約からコンポーネントの骨組みを自動生成。

Page 29: SimpleModeler

One Source Multi Use

PIM

AppEngine Azure

JavaEEJAX-WSJAX-RS

SCA

Service Bus

GrailsRuby on RailsPython Django…

Integration Framework(Data Flow?)

Page 30: SimpleModeler

SimpleModeler & AppEngine Java

Web UIサービス

エンティティ

Page 31: SimpleModeler

Web UI

Web MVC→Web GUIHTML5/CSS3

REST/JSON

GWT2GWT-RPC

HTML4/jQueryREST/JSON

Page 32: SimpleModeler

SimpleModeler & AppEngine/Javaサービス

Page 33: SimpleModeler

サービス/コンポーネントの生成

コンポーネント本体リソースアダプタ

変化責務

コンポーネント本体実装

プロトコルファサード

JSONAtomPub XML WS-* CSV

<<abstract>>

<<abstract>>

<<abstract>><<abstract>>

リソースアダプタ

実装

変化責務実装

変化点

外部リソース

外部リソース

サービス契約

完全自動生成

雛形生成

Page 34: SimpleModeler

動的モデルの記述と実装

手続き 関数(宣言)

実装

状態機械

アクション

イベント 状態

ガード

状態機械

アクション

イベント 状態

ガード

状態機械

アクション

イベント 状態

ガード

状態機械モデル

サービスの挙動を適切なモデルで記述

実行時は状態機械ベースのリアクティブシステム

変換!変換はかなり難しい

モデルを作るのが難しい期待度大

Page 35: SimpleModeler

SimpleModeler & AppEngine/Javaエンティティ

Page 36: SimpleModeler

SimpleModelerが生成するレコード

共通属性作成日時、更新日時

論理更新、楽観ロックなどAtomPub

自己記述的スキーマバージョン

スキーマエボリューション

スキーマメタデータレコードのメタデータをインスタンスごとに持つ

更新ログ

論理更新、論理削除append-only

AtomPubフィールド対応

Page 37: SimpleModeler

メタ・モデル

Event

<<event>>

Actor

<<actor>>

Resource

<<resource>>

Powertype

<<powertype>>

Service

<<service>>

Rule

<<rule>>

UseCase

<<usecase>>

Usage

<<service>>

Page 38: SimpleModeler

メタ・モデルのインスタンス

ドメイン

イベント

アクター

リソース

業務ユースケース

システム・ユースケース

状態機械

業務タスク

システム・タスク

業務タスクをアクターとサービス・システムの対話として具体化

業務タスクの実行によってイベントが発生する

サービス・システム外にあるオブジェクト

サービス・システム上で発生するイベント

サービス・システムが管理しているオブジェクト

アクターと業務システムの物語

アクターとサービス・システムの物語

業務ユースケースのフローの中でサービス・システムと対話するステップ

脚本

物語

登場人物

出来事

道具

イベントに参加するアクター

イベントによって更新(+参照)されるリソース

イベントによって状態が遷移する

サービス

Page 39: SimpleModeler

関連

<<aggregate>>

<<part>>

関連の種類関連(association)集約 (aggregation)合成 (composition)whole-partの合成

多重度1, 0..1(?), 1..N(+), 0..N(*)

DataStore IdKey, String, Long

物理ID、論理IDエンティティ参照

物理ID、論理ID自動採番、手動採番物理更新、論理更新物理削除、論理削除unary、binaryリンク参照、Query参照キャッシュ有無トランザクション

気にしない、BASE、ACID

Page 40: SimpleModeler

EntityとValue Object(document)間の転記

<<event>>DEE顧客購入

<<actor>>DEA顧客

<<actor>>DER商品

<<item>>DEI顧客購入商品明細

顧客取引番号: DVI顧客取引番号

顧客番号: DVI顧客番号

商品番号: DVI商品番号

商品番号: DVI商品番号

価格: Money

個数: XUnsignedInt

顧客名: PartyName

日時: DateTime

商品名: DVN商品名

顧客番号: DVI顧客番号

明細番号: ItemNo

<<document>>DD顧客購入依頼文書

日時: DateTime

顧客番号: DVI顧客番号

商品番号: DVI商品番号

1...N 価格: Money

個数: XUnsignedInt

在庫数: XUnsignedInt

<<document>>DD顧客購入結果文書 顧客取引番号: DVI顧客取引番号

顧客取引番号: DVI顧客取引番号

日時: DateTime

顧客番号: DVI顧客番号

商品番号: DVI商品番号

1...N価格: Money

個数: XUnsignedInt

顧客名: PartyName

商品名: DVN商品名

Page 41: SimpleModeler

同期write +非同期ログwrite + 管理情報cache

Webブラウザ

アプリケーション(Servlet) Customer

Customer管理情報

TaskQueue

アプリケーション(Servlet)

処理結果ログ

memcache

アプリケーション(Servlet)

/_system/flush

/_system/event/log

/customer/c11/update-async?name=ABC_Taro

Cron

Page 42: SimpleModeler

非同期write

Webブラウザ

アプリケーション(Servlet)

Customer

Customer管理情報

TaskQueue

アプリケーション(Servlet)

処理結果ログ

memcache

アプリケーション(Servlet)

/_system/flush

/customer/c11/update?name=ABC_Taro

/customer/c11/update-async?name=ABC_Taro

④⑤

Cron

Page 43: SimpleModeler

powertype/区分コード

山田太郎 1

DP料金区分DEA顧客

無料

2 エントリ

3 プロフェッショナル

名前

12345ID ID 料金区分名

3料金区分

プロ料金区分

_料金区分名

2009-03-03料金区分_updated

updated

2008-10-10

2008-10-10

2009-05-05

<<actor>>DEA顧客

<<powertype>>DP料金区分

無料エントリプロフェッショナル

山田太郎

DD顧客

名前

12345ID

3料金区分

プロ料金区分

_料金区分名

Page 44: SimpleModeler

モデルとレコード

山田太郎

DEE注文

発効日

1234567ID

23456顧客

山田太郎顧客_名前

注文詳細

<<event>>DEE注文

<<part>>DEP注文詳細

山田太郎

DEA顧客

名前

12345ID

1..*<<actor>>DEA注文

<<resource>>DER商品

1

DEP注文詳細

135

2 246

3 369

ID 商品 商品_名前 価格

みかん

りんご

ぶどう

100

80

120

個数

5

3

8

135

246

369

ID 商品_名前 価格

みかん

りんご

ぶどう

100

80

120

updated

2009-05-05

2009-05-05

2009-05-05

2009-03-03updated

DER商品

updated 2009-09-09

Page 45: SimpleModeler

スキーマ・エボリューション(課題)

スキーマ V3

スキーマ V2

スキーマ V1

スキーマ V2ハンドラ

スキーマ V1ハンドラ

スキーマ V3ハンドラ

スキーマ V3エンティティ

スキーマ V1レコード

スキーマ V2レコード

スキーマ V3レコード

アプリケーション

生成

Page 46: SimpleModeler

まとめ

クラウド・アプリケーションはイベント駆動アーキテクチャのリアクティブシステムと想定。

クラウド・アプリケーションをDSL駆動で開発するためには、クラウド・アプリケーションを記述できるメタ・モデルとDSL文法が必要。

静的構造モデルと状態機械モデルはモデルから自動生成ができる。一方、ユースケースモデルからは自動生成できないので工夫が必要。

SimpleModeler&AppEngineで色々と試してみた感触では、相当のことができそうな気がしている。

Page 47: SimpleModeler

おまけ:SimpleModelerデモ

Page 48: SimpleModeler

諸元

SimpleModeler 0.1.5Grails 1.0.4Google App Engine/Python 1.1.9Eoogle App Engine/Java 1.2.0Google Web Toolkit 1.6.4Eclipse 3.4 Java EE Developers + Google App Engine Plugin

Page 49: SimpleModeler

デモ手順

SimpleModelリポジトリ

CSV

マインドマップ

ScalaDSL

Grails

Google App EnginePython

Google App EngineJava

Google App EngineJava

Google Web Toolkit

Web仕様書

Groovy/Spring/Hibernate

Python/Django/Dojo Toolkit

Java/JDO/Servlet/JSP/Dojo Toolkit

Java/JDO/Google Web Toolkit

クラス図/ステートマシーン図/状態遷移表

Page 50: SimpleModeler

CSVとクラス図

#actor,parts,attrscustomer,,phone#resourcegoods,,note#eventbuy,customer;goods

demo.csv

Page 51: SimpleModeler

SimpleModelerデモ①CSV→マインドマップ

$ simplemodeler –convert demo.csv

Page 52: SimpleModeler

SimpleModelerデモ

マインドマップ

Page 53: SimpleModeler

SimpleModelerデモ②マインドマップ→Scala DSL(SimpleModelリポジトリ)

$ simplemodeler –project demo$ cd demo$ simplemodeler –import ../demo.csv

–import.package:com.demo$ mvn compile

Page 54: SimpleModeler

SimpleModelerデモ③Scala DSL→Grails

$ grails create-app grailsdemo$ simplemodeler –grails com.demo –

output:grailsdemo$ cd grailsdemo$ grails generate-all com.demo.DeeBuy$ grails generate-all

com.demo.DeaCustomer$ grails generate-all com.demo.DerGoods$ grails run-app

Page 55: SimpleModeler

SimpleModelerデモ

Grails

Page 56: SimpleModeler

SimpleModelerデモ④Scala DSL→Google App Engine/Python

$ simplemodeler –gae com.demo –gae.project:simplemodelerdemo –output:gae

$ dev_appserver.py gae$ cd gae$ cd appcfg.py update

simplemodelerdemo

Page 57: SimpleModeler

SimpleModelerデモ

Google App Engine/Python

Page 58: SimpleModeler

SimpleModelerデモ⑤Scala DSL→Google App Engine/Java

[Eclipse]gaejプロジェクト作成

$ simplemodeler –gaej com.demo –gaej.project:simplemodelerdemo –gaej.gwt –output:../gaej

[Eclipse]リフレッシュ

[Eclipse]Gaejプロジェクト起動

[Eclipse]Googleアップロード

Page 59: SimpleModeler

SimpleModelerデモ

Google App Engine/Java Servlet/JSP/Dojo Toolkit

Page 60: SimpleModeler

SimpleModelerデモ

Google App Engine/JavaGoogle Web Toolkit

Page 61: SimpleModeler

SimpleModelerデモ⑥CSV→マインドマップ→Scala DSL→Web仕様書

$ simplemodeler –convert yorozu.csv$ simplemodeler –project yorozu$ cd yorozu$ simplemodeler –

import ../yorozu.csv$ mvn compile$ simplemodeler –html com.yorozu –

output:target/html.d

Page 62: SimpleModeler

SimpleModelerデモ

CSVで記述できること

yorozu.csv

#actor,base,parts,attrs,powers,states,roles顧客,,,住所個人顧客,顧客,,,性別(男性;女性)法人顧客,顧客従業員,,,,,,店員#role店員#resource商品,,製品+,,,商品状態(入荷待;在庫中;配送中;販売完)製品#event顧客取引,,顧客;店員顧客購入,顧客取引,商品+

Page 63: SimpleModeler

SimpleModelerデモ

マインドマップ(XMind)

Page 64: SimpleModeler

SimpleModelerデモ

Scala DSLpackage com.yorozu

import org.simplemodeling.dsl._import org.simplemodeling.dsl.datatype._import org.simplemodeling.dsl.domain._import org.simplemodeling.dsl.domain.values._

case class DER製品 extends DomainResource {term = "製品"caption = "製品"brief = <t></t>description = <text></text>

id("製品Id", DVI製品Id())attribute("製品Name", DVN製品Name())

}

case class DVI製品Id extends DomainValueId {term = "製品Id"caption = "製品Id"brief = <t></t>description = <text></text>

attribute("value", XString)}

case class DVN製品Name extends DomainValueName {term = "製品Name"caption = "製品Name"brief = <t></t>description = <text></text>

attribute("value", XString)}

Page 65: SimpleModeler

SimpleModelerデモ

Web仕様書

Page 66: SimpleModeler

SimpleModelerデモ

クラス図

Page 67: SimpleModeler

SimpleModelerデモ

Scala DSL→ステートマシーン図

package com.yorozu

import org.simplemodeling.dsl._import org.simplemodeling.dsl.datatype._import org.simplemodeling.dsl.domain._import org.simplemodeling.dsl.domain.values._

case class DER商品 extends DomainResource {term = "商品"caption = "商品"brief = <t></t>description = <text></text>

id("商品Id", DVI商品Id())attribute("商品Name", DVN商品Name())association("製品", DER製品(), OneMore)statemachine(DM商品状態())

}

・・・中略・・・case class DM商品状態 extends DomainStateMachine {

term = "商品状態"caption = "商品状態"brief = <t></t>description = <text></text>

state(DMS入荷待())state(DMS在庫中())state(DMS配送中())state(DMS販売完())

}

case class DMS入荷待 extends DomainState {term = "入荷待"caption = "入荷待"brief = <t></t>description = <text></text>

transition(DEE商品入荷(), DMS在庫中())}

case class DMS在庫中 extends DomainState {term = "在庫中"caption = "在庫中"brief = <t></t>description = <text></text>

transition(DEE顧客購入(), DMS配送中())transition(DEE顧客購入(), DMS販売完())

}

case class DMS配送中 extends DomainState {term = "配送中"caption = "配送中"brief = <t></t>description = <text></text>

transition(DEE商品配送(), DMS販売完())}

case class DMS販売完 extends DomainState {term = "販売完"caption = "販売完"brief = <t></t>description = <text></text>

}

Page 68: SimpleModeler

SimpleModelerデモ

ステートマシーン図と状態遷移表