ここでは,DTRAMを用いて記述したInventoryManagementの課題について説明します.
以下にInventoryManagementのモデルを示します.こちらを適宜参照しながらモデルの理解を行ってください.
以下のモデルでは始めに,新規に取り扱う商品を入荷する時に使用されるイベントチャンネル,ItemRegistraction
を宣言しています.
次にある,ReceivingOrShipping(itemId:
は itemId
を用いて
登録されている商品に対して出荷か入荷を行う時に使用されるイベントチャンネルになります.
channel ItemRegistration {out inventory(itemDB:Map , registerItem(itemId:Str , itemName:Str , quantity:Int )) = insert(itemDB, itemId, {"count": quantity, "name": itemName}) }channel ReceivingOrShipping(itemId:Str ) {out inventory.{itemId}.count(prev_quantity:Int , receiveOrShip(quantity:Int )) = prev_quantity + quantity }
先ほどのInventoryManagementを,DTRAMの可視化ツールを使用して,モデルを可視化した図が以下の通りになります.
まず,始めに商品全体を管理する倉庫を表している inventory
というリソースがあります.
次に,その下の階層に inventory
リソースを親にしている,inventory.{itemId}
という子リソースがあります.
この子リソースは,商品を識別するためのIDを表す itemId
という
パスパラメータがあるので,一意なリソース(商品)を特定することができます.
そして,最後に inventory.{itemId}
リソースを親にしている,inventory.{itemId}.count
という子リソースがあり,特定の商品の在庫数量を表しています.
ここでは,InventoryManagementの仮想実行について説明します.InventoryManagementの仮想実行で用いるテストケースは次の通りです.
先ほどの仮想実行を可視化したものを以下に示していきます.
まず,システムの初期状態を可視化したものが以下の図です.
初期状態のため,inventory
リソースには何の商品も登録されていないという状態になっています.
次に,テストケースの1を実行していくので,inventory
リソースをダブルクリックします.
ダブルクリックすると,registerItem
というメッセージが選択できるので,こちらを選択します.
次に,inventory
リソースに対して,商品のIDを表す itemId
と
商品名を表す itemName
,入荷数量を表す quantity
を入力できる画面が表示されます.
ここでは,inventory
リソースに対してregisterItem(@123, "Asahi", 100)
というメッセージを入力し,実行します.
実行した結果,次の状態に遷移することができたので,固有のID(@123)の状態を持ったinventory.@123
と
在庫数量が100の状態を持ったinventory.@123.count
,商品名がAsahiの状態を持った inventory.@123.name
という
3つのリソースが表示されました.
次に,テストケースの2を実行していきますので,inventory.@123.count
リソースをダブルクリックします.
ダブルクリックすると,メッセージを選択する画面が先ほどと同様に表示されますので,出荷と入荷の両方を行うことができる receiveOrShip
を選択します.
次に,出荷数量,または入荷数量を入力可能な画面が表示されますので,receiveOrShip(-50)
と入力して実行します.
次の状態に遷移したため,inventory.@123.name
リソースの状態が50に遷移したことが確認できました.
本課題ではまず,上記にて説明を行ったInventoryManagementに,とある機能を追加した時のモデルと可視化の図を
実験参加者の皆様に見て頂きます.
次に,その2つを見てどの様な機能が追加されたのか,またどの様なシナリオになっているのかを
考えて頂き,以下のアンケートにお答えください.
channel ItemRegistration { out inventory(itemDB:Map , registerItem(itemId:Str , itemName:Str , quantity:Int )) = insert(itemDB, itemId, {"count": quantity, "name": itemName}) }channel Receiving(itemId:Str ) { out inventory.{itemId}.count(prev_quantity:Int , receive(quantity:Int )) = prev_quantity + quantity }channel Shipping(itemId:Str ) { out inventory.{itemId}.count(prev_quantity:Int , ship(quantity:Int )) = prev_quantity - quantity }
課題アンケート (別タブが開きます)
課題終了後の評価アンケート (別タブが開きます)