ここでは,InventoryManagementのDTRAMによる仕様記述に関する課題に取り組んでいただきます.
以下にDTRAMで記述された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
リソースは商品全体を保管する倉庫を表しており,
を流れるメッセージ( registerItem
)を受け取ります.
次に,inventory
リソースの子リソースとして,inventory.{itemId}
リソースが表示されています.
このリソースは,商品IDを表す itemId
というパスパラメータを持っているため,一意なリソース(商品)の特定を可能にしています.
最後に,inventory.{itemId}
リソースの子リソースとして,itemId
で示された商品の在庫数を表す inventory.{itemId}.count
リソースが表示されており,
を流れるメッセージ( receiveOrShip
)を受け取ります.
ここでは,InventoryManagementモデルの仮想実行について説明します.この仮想実行で用いるテストケースは次の通りです.
仮想実行を,シミュレーションツールを使用して可視化したものを以下に示していきます.
まず,システムの初期状態を可視化したものが以下の図です.
初期状態のため,inventory
リソースには何の商品も登録されていない状態になっています.
次に,新商品(Asahi)を登録するので,inventory
リソースをダブルクリックします.
inventory
リソースに対して,registerItem
という商品を登録するためのメッセージが選択できるので,こちらを選択します.
商品IDを表す itemId
と商品名を表す itemName
,初期数量を表す quantity
を入力できる画面が表示されます.
ここでは,registerItem("@123", "Asahi", 100)
を入力します.
次の状態に遷移したので,商品IDが@123という状態の inventory.@123
と
在庫数量が100という状態の inventory.@123.count
,商品名がAsahiという状態の inventory.@123.name
の3つのリソースが表示されました.
次に,登録した商品(Asahi)を50個出荷したいので,inventory.@123.count
リソースをダブルクリックします.
メッセージを選択する画面が同様に表示されますので,入荷か出荷を行う receiveOrShip
というメッセージを選択します.
入荷数量,または出荷数量の入力が可能な画面が表示されますので,ここでは receiveOrShip(-50)
と入力して実行します.
ここで quantity が正の値のときは入荷,負の値のときは出荷が行われます.
次の状態に遷移したため,inventory.@123.count
リソースの状態が50に遷移したことが確認できました.
本課題ではまず,上記にて説明を行ったInventoryManagementの仕様に,ある機能を追加した仕様を考えます.
その仕様のモデルと,仮想実行の流れを可視化した以下の図を見ていただいた上で,2つの設問にお答えいただきます.
設問にお答えいただく際は,必ず設問1,設問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 }
課題アンケート (別タブが開きます)
課題終了後の評価アンケート (別タブが開きます)