Alloyガール4

Alloyガール1Alloyガール2Alloyガール3の続き。

StateManagerにつながってないStateは良いのか悪いのか?

JS: Stateが3つの例だけが出るようになったー
僕: うんうん、よかったね
JS: でもー、さっき全パターン表示した時に気づいたんだけど、StateManagerにつながってないStateがあるよ?

Alloy: 何か問題でも?
JS: えっ?
Alloy: あなたがモデリングしようとしている対象で、StateがStateManagerに属していない状態があるの?ないの?それ次第でしょ?
JS: み?
僕: つまり、実装で表現するなら下のどっちなのか、って話だね

// A:
var state = create_new_state();
state_manager.add("state_name", state)
// B:
state_manager.create_new_state("state_name")

JS: なるほど、Aの実装だとStateManagerに属していないStateがあってもおかしくないのか。
僕: そういうこと。どちらを選ぶか、は設計判断だね。どっちを選ぶのが正しいのかは状況による。
JS: ちょっとどういう実装にしたか見てくるー。あ、Bにしてた!
僕: そうか、じゃあ「すべてのStateはStateManagerに属している」って事実があるわけだね。
JS: うん!

事実の宣言

僕: じゃあ事実を宣言しよう。

one sig StateManager {
	state: set State
}

sig State {}

fact {
	all s: State | s in StateManager.state
}

run {
} for exactly 3 State

JS: factってのが「事実」?
僕: そう。常にtrueになるような式をここに書くんだ。中身の「all s: State | …」は「すべてのState sについて…が成り立つ」って意味だよ。
JS: で、StateManaerのstateの中にsが入っている、って宣言してるのね。
僕: そうそう。これで実行すると「exactly 3 State」ってスコープにしているから、1個のStateManagerと3個のStateがつながったモデルが出てくる。Nextを押すと解がそれ1個だってわかるね。
JS: StateとStateManagerがちぎれてる例が出なくなったね!


次回予告

Alloy: まどろっこしいなぁ。それって「すべてのStateは必ず1つのStateManagerに属している」ってことじゃないの?

one sig StateManager {}

sig State {
	belong: StateManager
}

run {} for exactly 3 State

JS: そうとも言うー?
僕: いや、でもStateManagerからたどりたいじゃない?
Alloy: たどる?何を言っているのかしら。もしかしてStateManager.stateがStateManagerのメンバ変数だとか、State.belongがStateのメンバ変数だとか勘違いしているんじゃない?
僕: えっ、違うの?
Alloy: ぜんぜん違う。オブジェクト指向に毒されているわね。