読者です 読者をやめる 読者になる 読者になる

謎言語使いの徒然

適当に気になった技術や言語を流すブログ。

AlloyAnalizer をちまちま使ってみる

日記

仕様をモデル化してその関係性を洗うツールだそうで。

勉強元はこれ http://thinkit.co.jp/story/2010/09/22/1766?page=0,1

とりあえずチュートリアルを流そう

sig User {
  roles:set Role
}

sig Role {
  permissions: set Permission
}

sig Permission {}

run{}

そして、処理してできた「Instance」をクリックすると、発生しうる関連性を図示してくれると。
set以外にも

lone 0 または1
one 1
set 0 以上
some 1 以上

で設定できると、、、。
ビジュアルウィンドウでの操作は、

-> 集合同士に対して指定、新しい関係を作る
. 2 集合のジョイン

そしたら、関数を使って、関係をたどり、あるユーザの持つ権限の集合を取得するとな

fun perms[u:User]:set Permission {
  u.roles.permissions
}

なるほど。Role に上位権限を持たせて

sig Role {
  permissions: set Permission,
  superRoles:set Role
}

ループしないように条件を指定

fact {
  no r:Role | r in r.^superRoles
}

文法から、

fact 事実条件の設定
no 否定
r:Role Role に関する条件
in 前途の引数が保持する何か
^ たどり着ける要素全部

なるほどね。

/* ユーザーにロールを付与する。 */
pred addRole[u,u':User,r:Role] {
	u'.roles=u.roles + r
}

/* ユーザーからロールをはく奪する。 */
pred removeRole[u,u':User,r:Role] {
	u'.roles=u.roles - r
}

/* ロールに権限を付与する。 */
pred addPermission[r,r':Role,p:Permission] {
	r'.permissions=r.permissions + p
}

/* ロールから権限をはく奪する。 */
pred removePermission[r,r':Role,p:Permission] {
	r'.permissions=r.permissions - p
}

とか使えると。