10

18

[状態マシン図] ウォシュレット(商標) 解答例 その2

2013.10.18(21:20)

問題
http://saltheads.blog134.fc2.com/blog-entry-127.html
の解答例 その1
http://saltheads.blog134.fc2.com/blog-entry-128.html
に対し、別の解法があります。おしり洗浄と、ビデ洗浄と、乾燥は同時におきることはないので、AnyStateパターンで設計すると、遷移の数が少なく理解しやすいモデルになります。

(画像アップデート中)

この状態マシン設計には、以下のような、UML2.0状態マシンの仕様を使っています。

状態が入れ子になっていて、内側の状態から遷移するイベントと、外側の状態から遷移するイベントが同一だった場合は、もっとも内側の状態からの遷移にイベントが消費され、外側にはイベントは投入されない。(UML2.0仕様書 p.716~717 発火優先度)
たとえば、
state310.png
state_310の状態にいるときは、evTemp0イベントで、state_320に遷移するとともに、
state_310はstate_300の内側にいるので、evTemp0イベントで、state_300を退状して入状するようにも思えます。
しかし、状態マシンの仕様により、
evTemp0は、もっとも内側のstate_310からstate_320への遷移に消費され、state_300を退状するのには使われません。
以下のように遷移します。
state320.png
state_320には、evTemp0イベントによる遷移が定義されていないので、
state_320でevTemp0を受け取ると、それはstate_300から退状して入状するのに使われ、
state310.png
になります。
ウォシュレットの状態マシンで、おしり洗浄中にいるときは、おしりボタンをおされても、おしり洗浄中の内側でそのイベントは消費されるので、着座検出中を退状しません。なので、おしり洗浄中に初めて入ってからカウントアップしはじめたタイマーは止まることなく続行します。
乾燥中の内側に、乾燥ボタンイベントを消費するためだけに、乾燥中の乾燥中という状態を作っているのは、おしり洗浄中やビデ洗浄中と同様、タイマーを再スタートさせないためのしくみです。

参考文献

プロフィール

島敏博

Shima Toshihiro 島敏博
信州アルプスハイランド在住。HaskellとElixirが好き。組み込みソフトウェアアーキテクト、C++プログラマ、山歩き、美術館巡り、和食食べ歩き、日本赤十字社救急法指導員、インデックス投資、クラシック音楽、SESSAME会員、状態マシン設計、モデル駆動開発、ソフトウェアプロダクトライン、Rubyist、実践ビジネス英語

■ ツイッター
http://twitter.com/saltheads
■ Facebook
http://www.facebook.com/saltheads
■ Qiita
http://qiita.com/saltheads

印刷する場合は、ブラウザの印刷メニューではなく、このページの上から3cmくらいの青いところにある、「印刷」を押してみてください。少しうまく印刷できます。まだ完全ではないのですが、これで勘弁してください。


カテゴリ
最新記事
月別アーカイブ
最新コメント
検索フォーム
リンク
sessame
RSSリンクの表示