Alloyガール2

Alloyガール1の続き。

僕: ただいまー
Alloy: あら、随分長い間保健室にいたのね。何してたの
僕: それはもうJavaScriptとイチャイチャと…って何言わすねん
Alloy: 冗談よ。
僕: …。
JS: ねえねえ、StateManagerが2個ある問題を解決しようよー
僕: そうだったそうだった。

StateManagerは1個である

僕: じゃあそういうわけで、StateManagerは1個だと宣言することにしましょう。
JS: えっと、コンストラクタをプライベートにするんだよね。
僕: いや、それJavaだし。
JS: あれ?objectって宣言するんだっけ??
僕: それはScalaか?
Alloy: 前回oneだって言ったじゃないの。聞いてなかったの?
JS: oneってどこに書くの?
Alloy: ここよ

one sig StateManager {
	state: State
}

sig State {}

run {}

JS: run {}のところに書くんじゃなかったの?
Alloy: そこに書きたいのであればこうね

sig StateManager {
	state: State
}

sig State {}

run {
	one StateManager
}

JS: どう違うの?
Alloy: 等価だけど何か?
僕: んー、例えばrunを複数個書いた時に、どれを実行するかはメニューから選べるから、オプションの違う探索を使い分けたい時とかにrunの述語の方に書くといいのかな?
JS: うーん、そんなめんどくさいことするかなぁ
僕: うむむ…。
JS: まあいいやー、ようするにrun {}の方に書いてあるのはなんか一時的みたいなー、常に使われるわけじゃないみたいなー、そんな感じね!
僕: うん、まあ、それでいいや。

Stateは0個以上

Alloy: ところでStateManagerとStateの関係が1対1でもいいのかしら
JS: えっ?
Alloy: stateの宣言に何も修飾がついていないから、これはデフォルトで1対1の関係よ

sig StateManager {
	state: State
}

JS: それは困るなー。
Alloy: 0個以上ならset、1個以上ならsome、0または1個ならloneね。
JS: どこに書くの?
Alloy: こう

sig StateManager {
	state: set State
}

JS: 実行してみよう!エイッ☆

JS: わー、それっぽいものができたよー
僕: ちなみにShow Metamodelすると
JS: メタモデルがShowするんだね!
僕: 何の説明にもなってないぞそれ…

次回予告

僕: 次は何をしようか
JS: えっとねー、各Stateが引数のないメンバ関数enterとexitを持っていて、あとオブジェクトの型とイベントの型から適切なイベントハンドラを探してディスパッチするtriggerって関数がある!あ、あとStateManagerはcurrent_stateを持ってる!
僕: なんかとてもAlloy的じゃないことを言ってる気がするけど…まあいいか。じゃあ次回はそれをAlloyで表現して見ることにしよう。