**********************************************************************
セッションS5-d
テーマ:頻出パターンから学ぶUML状態マシン図
講師:島 敏博
日時:2018/8/31 13:00~14:10
参加人数:12名
**********************************************************************


■内容
・ソフトウェアの動的なふるまいを表現する仕様書はどのようにして書かれているか。
・頻出パターンから状態マシン図を学んでいく


■状態マシン図とは
・動的な状態を表現する図面
・イベントが起きるまで待ち、起きたときに何をするのかを書く
・起きることが状態によって変わることを表現するための図

■状態マシン図の説明
・p3図の説明
 セサレットが一番大きい状態を表す。黒丸からスタート。
 上と下の二つの状態があるのでそれらは同時に動く。(上の領域、下の領域)

 上の領域は着座センサーOFFから始まる。
 遷移がイベントを表し、着座検出というイベントが起きると着座センサーONの状態に
 なることを表している。

 着座センサーONの中にも領域があり、最初は洗浄待機中。
 お尻ボタンで遷移し、おしり洗浄中に入るとおしり洗浄開始というアクションを呼び
 出す。お尻洗浄中が終わる条件は2つあり、停止ボタンを押すか60秒タイムアウトをす
 るかのどっちか。
 どちらか早いほうが起きたときにおしり洗浄中を出ることができる。
 出てくるときにおしり洗浄停止というアクションを呼び出す。

 この図面はお尻ボタンが押せるのは着座検出した後でないと押せない。
 またおしり洗浄中はお尻ボタンが押せないというのを表現している。

 入っていないイベントは無視するのが状態マシン図の特徴。
 tm(60秒)はタイムアウト60秒という意味。

 起立を検出すると着座センサーOFFの状態にいく。
 着座センサーONのなかならどの状態でも起立を検出すると遷移することを表現してい
 る。おしり洗浄中で起立するとおしり洗浄停止してから着座センサーOFFに遷移する。

 二つ以上の状態をまとめて名前をつけて、その中にいるのであればいつでもイベント
 で違う状態に遷移できる。


 下の領域は流すボタンを表現。流すボタンを押すとフラッシュ中に入り水が流れます。
 終わるとフラッシュ待機中に戻る。

 このシステムではお尻を洗っている最中でも水を流すことができる。
 独立して動くことができることを表現している。

 上記の条件を箇条書きして書くと伝わりづらい。
 そこで図で表せる状態マシン図が必要となってくる。


・p4図
 状態マシン図はクラスに定義される。
 セサレットは受けっとったイベントを自身の状態を変化させ、やらなくてはいけない
 アクションをいつ実行するのかを決めている。
 外部からくるイベントを何をいつするのかを決定している。
 状態マシン図を書くときはクラス図と一緒に書く。

 コントロールパネル側から各ボタン(お尻ボタン、停止ボタン、流すボタン)が、
 シートセンサーから着座検出と起立検出結果が来る。
 セサレットは受け取ったイベントで何をするのかを書く。

 タイマーをいつ設定するかは各クラスで設定できるようになっている。
 それ以外のイベントはほかのクラスから送られてくる。
 このようにほかのクラスから送られてくるイベントで、何をするか決める設計のことを
 オブジェクト指向設計という。


p5図
 do/フラッシュ
 doというのはフローアクティビティ図(UMLの図)
 アクティビティとは非同期で実行される一連の長い処理。
 アクションは同期呼び出し。

p6図
 ・図1
 最初はタイマー停止中にいてスタートボタンが押されるとタイマー動作中に遷移し、
 停止ボタンかタイマーが終わるとタイマー停止中に戻る。
 停止ボタンではアクション1は実行されないが、タイムアウトだとアクション1が実行
 される。

 ・図2
 図1のタイマーが終わったときがまた動作中に戻り、再びタイマーがセットされる。
 停止ボタンで出たときもタイムアウトになった時もアクション2を実行してから出て
 いくことを表現している。



■頻出パターン

・Watchdogパターン(p7)
 スタートボタンが押されるとタイムアウト待ちに遷移する。
 タイムアウトが起きるとfatalError()が起きるようになっている。
 本来なら10秒以内でtouchが呼ばれタイマーが更新され、ストップボタンでオフ状態に
 戻る。
 これを繰り返している間はシステムが正常に動いているが、touchが機能しなくなると
 エラーの文字が出ることを表現している。

・複数のタイムアウトを持つ(p8)
 組込みでは複雑なタイマーの使い方がいっぱいある。
 図は1分おきにアクション1を、4分おきにアクション2を実行する。
 4分おきに二つの動作が重なってしまうので、まず30秒ずらしてから実行するという意
 図がわかる。

 タイマーの動作は図の下のアクション2の例でいうと、4分たってからアクション2を行
 い、またタイマーをかける。つまりアクション2を実行する時間が長いとずれが生じる
 。UMLは仕様なので気にしない。

・数を数える(p9)
 発券機からは台数を増やすイベントが、精算機からは台数を減らすイベントが来る。
 台数カウンタは満車なら赤信号を出し、空きがあるなら空車と表示する。

 最初はカウンタ0で空きあり状態に入る。台数が増えたらカウンタがNになっているか
 確認しなっていなければ空きありに戻ってくる。Nであれば満車状態に入り、full()を
 呼ぶ。精算機からマイナスが来ればnot_full()を呼び、空き状態に戻す。

・データ送受信(p10)
 書き込み制御領域はデータバッファがいっぱいになるまで書き込み、
 いっぱいになったところで書き込めない状態に遷移する。
 読みだすが実行されるまで書き込めない状態で待機。
 それと同様に読み出し制御領域もバッファが空になった段階で読み出せない状態に
 遷移。書き込まれるまで待機。

・IS_INマクロとGENマクロ(非UML) p11
 ある状態にいるかどうか判定する IS_IN(状態名)
 状態マシンにイベントを投入する GEN(イベント名)

 下の領域で evWakeUp[IS_IN(電源OFF)]/GEN(evOnOff)とは
 「朝になったタイミングで電源OFF状態にいるのならevOnOffというイベントを一回実
 行する」を表現している。

・Latch State パターン (p12)
 上の領域で待機中から電源オフ処理と印刷中の二つの状態に遷移できる。
 印刷中に電源OFF処理はさせたくないので、2番目の領域を用意して電源オフ要求が来
 たら電源オフ要求ありに遷移するようにしておく。
 印刷中が終わったときに行き先を変えることができる。

 何かを実行している最中にほかのものはできないが、順番に実行していくことができ
 る。仕様書でもどれを先に実行するのかをしっかり決めていくことが重要。
 状態マシン図は誰でも読むことができる。

・同期をとる、ジョイイン疑似状態(p13)
 停車状態からドアを閉めて発車可能状態にする。しかしホームドアと車両ドアがどち
 らが先に閉まるという決まりはない。両方閉まらないと発車可能にならない。

・iPhoneアプリ(p14)
 最初起動していない状態からアプリを起動するとアクティブに遷移しコードを実行す
 る。ホームボタンやほかのアプリが起動すると非アクティブ状態に遷移。
 バックグラウンドへ行くと30秒はコードが実行できるが、
 それ以上たつとコードが実行できなくなるサスペンド状態へ遷移。
 さらに3分たつとメモリから追い出され、実行していない状態になる。
 ブルートゥースの通信でバックグランドから戻ってもデータが通信し続けている。

 つまりコードの実行を保つ仕組みがある。こういう仕組みを仕様書として書いておく
 と、iOSのアップデートに迅速に対応できたり、社内での理解を促進できる。

・ロータリーエンコーダ(p15)
 どの状態からどの状態にもいける状態マシン図。
 モーター停止中にいるならば、開要求で開状態に、閉要求で閉状態に遷移する。

・履歴を覚える(p16)
 電源を切ったときに前の状態を記憶しておいて戻す。
 FMで電源を切った人はFMで起動するしAMで電源を切った人はAMで起動する。


・Any Stateパターン(p19)
 p18のどの音源にも切り替えられるラジオは機能が増えていくごとに状態遷移図が
 どんどん複雑になっていく。そこで改良されたのがこの状態マシン図。
 見やすくもなっている。
 また同じ場所に遷移しないように設定した状態マシン図がp20である。
 FMからFMへ行こうとしたとき一回切れてまた同じものがつくのではなく、何も起きな
 いようにする。

・センサーとアクチュエーター(p21)
 自分で制御できない外部の部分を把握するセンサーと、そのデータから自分がどうす
 るかを決めるアクチュエータから世の中のものはできている。
 コントロールできるものとできないものが同時に動いている。こういったパターンは
 よく出てくる。

・複数のタイマーを同時にまつ。
 1秒おきに、赤外線を照射して人がいるかどうかを判断する bool found()を呼ぶ。
 人がいれば点灯し、その後人がいなくなってから5秒後に消灯する。


■状態マシン図のまとめ
 状態マシン図を書いているときは実装のことは何も考えなくてよい。
 ひたすら何が起きたときに何をやれるのかを書き出していき、お客様の言葉を使って
 それを表現するというのが状態マシン図。
 その状態マシン図から早期に仕様が確定することを目指す。


■状態マシン図がどう実装されるか
 状態マシンとは「今の状態から発生したイベントから、次の状態を決定する」関数の
 モデル。
次の状態 = 関数(今の状態、発生したイベント);

 イベントドリブンに動く
C言語の話なのでp25を参照


■参考文献(p27)
 今回のスライドにこの参考文献すべてが入っているわけではない。
 2日間セミナーではこのような文献から構成。

・要求を仕様化
  • [Shmz2010] 「要求を仕様化する技術・表現する技術 改訂第2版」,清水吉男,2010

・クラス間でよく出てくる23パターンの表現を集めたもの
  • [GoF1995] 「オブジェクト指向における再利用のためのデザインパターン」,1995
  • [Yuki2004] 「増補改訂版 Java言語で学ぶデザインパターン入門」,結城浩,2004

・状態マシン図をC言語で書いたもの
  • [Dwm2005] 組み込みソフトウェア開発スタートアップ Design Wave Magazine,2005
  • [Hanai2013] モダンC言語プログラミング 花井志生,2013

・イベント取り分で大規模システムを作っていく
  • [Ses2006] 「組込みソフトウェア開発のための オブジェクト指向モデリング」,
SESSAME WG2,2006

・UMLの仕様書
  • [Omg2006] 「UML2 仕様書 2.1対応」,Object Management Group,2006

・UMLの各図面の見方
  • [Ogi2006] 「その場でつかえる しっかり学べる UML 2.0」,
オブジェクトの広場,2006
  • [Ogi2013] 「かんたんUML入門」、オージス総研監修,2013

・UMLで書いた図面をどうやってプレビューするかが書いてある
  • [Sco2006] 「UML 2 スタイルガイドブック」,Scott W.Ambler,2006

・状態マシン図でよく出てくるパターン
  • [Bru2001] 「リアルタイムUML第2版」,Bruce Douglass,2001
  • [Bru2009] 「リアルタイムUMLワークショップ」,Bruce Douglass,2009

・動的制御 静的制御
  • [Ino2011] 「ダイアグラム別UML徹底活用 第2版」,井上樹,2011

・ソフトウェアを学ぶ(グラフ理論など)
  • [Tam2004] 「ソフトウェア工学の基礎」,玉井哲雄,2004

・コンパイラがやっている言語処理 オートマトン
  • [Tom2014] 「アンダースタンディング コンピュテーション 」,
Tom Stuart,2014