07

15

状態マシン図 演習 解答例1ー2

2010.07.15(23:29)

(2-1) CDラジオをモデリングしなさい。
CDラジオには、チャンネルを切り替えるボタンがあり、CD、AM、FM、TVの音源をそれぞれ再生する。チャンネルを切り替えるボタンはいつでもどれでも押すことができ、押されたら直ちにその音源を再生する。


どの状態からどの状態へもゆけます。4つの状態があるので全部で4x3=12通りの遷移があります。状態が増えると急速に複雑になります。このような場合は、コンポジット状態を使うとすっきり表現できます。


これを、AnyStateパターンといいます。 ★1

(2-2) 1つ前のCDラジオを拡張し、電源ボタンをつけなさい。
電源ボタンは1つだけで、それを押すとONになり、もう一度押すとOFFになる。


工場出荷時は FM選択になっているものとしました。Off状態からOn状態に遷移するイベントも、On状態からOff状態に遷移するイベントも同じです。

(2-3) 1つ前のCDラジオを拡張し、
電源を切ると、そのときに選ばれていた音源を記録し、
次回電源投入時はそこを選択して直ちにその音源を再生する。


履歴を使います。前回、このコンポジット状態の中のどこの状態にいたかを覚えておき、次回このコンポジット状態に遷移したときに、その状態に遷移して始まります。

第1回目だけは、履歴が残っていないので、そのときの行き先を、履歴から延びる遷移で示しておきます。

(2-4) 1つ前のCDラジオを拡張し、タイマーボタンをつけなさい。
タイマーボタンを押すと、ON状態になり、さらに、
あらかじめ決められている時間だけたつと電源がOFFになる。
タイマーのカウントダウン中にタイマーボタンを押すとカウントダウンは停止され、
電源ON状態のまま維持される。


On状態に直交して、タイマーのOff状態、On状態があると考えて、On状態を2つに分ける直交状態を作ってみました。Off状態でタイマーボタンを押すと、タイマーOn状態に遷移します。

しかしこの状態マシンには課題があります。音源を切り替えているAnyStateパターン部分は、たとえば、AMラジオボタンを押すと、いったんOn状態から脱出してから、AM状態に遷移します。つまり、On状態をいったん退場し、ふたたび入場して、AM状態になります。

そのときに、もう1つの直交状態のほうは、開始疑似状態に戻り、タイマーOff状態になってしまいます。つまり、音源を切り替えると必ずタイマーがOffになってしまいます。


上記の問題を解決したのがこのモデルです。全体を1つのコンポジット状態とみなし、それを2つに分ける直交状態を作ります。これなら、音源を切り替えても、タイマーの状態に影響がありません。

タイムアウトが起きたら、evOnOffを発生させて、Off状態に遷移させます。

(2-5) 1つ前のCDラジオを拡張し、アラーム機能をつけなさい。
アラームボタンがあり、アラームをON、OFFにできる。アラームがONのときには
あらかじめ設定されている時刻になったら、電源がONになり、音源を再生する。


アラーム機能は、電源のOff,On、タイマーのOff,Onとは直交して遷移するので、これも直交状態を使います。アラームOn 状態のときは、時刻が来たとき、もしOff状態だったら、On状態に遷移させます。IS_IN(Off)は、もしOff状態だったら、という意味です。

★1
リアルタイムUMLワークショップ
ブルース・ダグラス (著), 鈴木 尚志 (翻訳)
http://www.amazon.co.jp/dp/4798121118/

続く

コメントの投稿

非公開コメント

プロフィール

島敏博

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リンクの表示