**********************************************************************
セッションs4d
テーマ:SESSAME UML2状態マシン図設計ミニセミナー(前半) ~ソフトウェアに変換可能な仕様書をかけるようになろう~
講師:島敏博(セイコーエプソン株式会社)
日時:2017/8/25 13:00-14:10
参加人数:18名(終了時)
**********************************************************************

本セッションでは、質疑を常に受け付け、ディスカッション形式で行いました
そのため、本議事録も時系列順に質疑を記録しています

UMLセミナーの紹介
SESSAMEでは若手を対象とした設計セミナーを行っている
今回はその2日間のセミナーの短縮版
     ※次回は11月27日(月)〜28日(火)の2日間、東京にて開催されます。詳細は1ヶ月前ごろに http://www.sessame.jp/ に掲載予定です。

学習の狙い
UMLを理解し、状態マシン図の読み書き、レビューができるようになること

~UML(Unified Modeling Language、統一モデリング言語)とは~
OMGという団体が仕様を決めている
2.0でUMLは大きく変わった
図面からソースコードができるよう厳密に図を書けるようになった
日本語訳書籍が出ているが絶版
2.5が現在の最新
サンプルが増えたり、説明が増えたことでわかりやすくなった
1冊にまとまり、前から順番に見れば理解ができるようになった
2.0と2.5はほぼほぼ変わらない。表記法面ではほぼほぼ変わらない

英語では用語が決められたが、日本語の本やツールによっては用語がバラバラ
本セミナーでは、p5の用語一覧を使う

~状態マシン図を読んでみよう~
状態マシン図とは動的なふるまいを記述するための図のこと
状態マシンでは、イベントが発生するのを待っている状態を表し、その遷移先の状態と、それらの繰り返しを表現する

セサレット(例)の状態には上と下の領域があり、上と下が同時に動作していることをあらわす
どちらの領域も開始疑似状態とそこから遷移する最初の状態がある
書いていないイベントは無視される (ボタンは押せるが何も起きない)
領域が入れ子の状態になっている場合、領域内に加えて、領域外のイベントにも影響を受ける

**********************************
質問
レベルとエッジだとどっち?
お客様と話しするときや、実装するときには、どちらかに決めて話しする。
UMLでは、レベルで実装するのか、エッジで実装するのかは、決めていない。実装におまかせ。
p6は分析モデルと言ってお客様の要求を図にしたもので、この状態ではコードに変換できない抽象度の高いモデル
**********************************

状態マシンはクラスに定義される
システム全体が一個のクラスでできているならクラスが自分自身の状態を変化させ動作していると考える

クラスとクラスは関連で接続されていて、関連は一方向矢印である。
関連をたどってイベントが到着し、そのイベントでクラスの状態が遷移する。
なので、クラス図上にタイムアウト以外のすべてのイベントが描かれているはず。
タイムアウトだけは、状態マシンを実行しているクラス自体で発生させることができる。

タイマーは各クラスが必要な時に必要なだけ使えるとUMLでは考えている。
実際の組み込みシステムでは制限があるが、UMLの表記上ではタイマーの数に制限はない。

~UML 単純状態~
中に領域を持たない状態のこと
角が丸くなった長方形を状態、黒丸が開始疑似状態という
状態遷移図では遷移は矢印で一方向矢印
例:状態1を起点とし状態3を終点という
トップレベルに開始疑似状態がない図は誤り。

【p9】ガードとアクションがついてる例
アクションとは、関数呼び出しのようなもの
開始疑似状態を起点とする遷移にはイベントは書けないがアクションはかける
アクションは/の後ろにかく
[ガード]/アクション <ーガードの条件が真ならアクションが発火
状態に入る時に実行されるのが入場時アクション entry/
状態から出る時に実行されるのが退場時アクション exit/

イベントにアクションを設定しても良いし、入場時、退場時アクションに設定しても良い
どこに書いた方が良いというのはなく、設計において適切なところに書く

**********************************
質問 
関連に記述できるものは1つだけ?
関連にかけるのは0個か1つ。状態の中のentry、exitアクションも0個か1個持てる
例えばC言語の関数を2つ呼びたかったら、entry/の後に2つ、;で区切って書けば良い
**********************************
**********************************
質問
状態の中のアクションを遷移の横に書いても意味は同じ?
実装は異なるが、お客様から見て同じだったりする。
**********************************

~単純状態+タイムアウト~ p10
tm(10秒) 今回のセミナーではこれがタイムアウト10秒を示すとする
タイマーはOS依存、言語依存だが、UMLはOSや言語は何も規定せず、触れられていない。
状態を起点とする遷移がタイムアウトで発火する設計の場合、タイマーはその状態に入った時にスタートする

~ワンショットタイマーと繰り返しタイマー~
タイムアウトした後にもう一度状態に入ると繰り返しタイマーになる

**********************************
質問
複数の状態がタイマーを共有したいという場合は、記述方法があるのか?
UMLの表記方法では存在しない
**********************************

p12 レビュー力を高めるために、誤りを見つけてください
【図1、図2】
全ての遷移は矢印(位置方向)
同じ状態から同じイベントで発火する遷移が複数出ているものは誤り
ただし、ガード条件が異なり、重なりがない場合は可能
【図3】
同じ領域に同じ名前の状態が複数あってはならない
【図4】
ガード条件は同時に成立する可能性がないかを確認
同時に成立する場合はだめ
状態マシン図では発火する遷移が1つに決まらなければならない

状態を起点とする遷移はイベント [ガード]アクションが0個か1個設定できる
イベントが書かれていないものは無条件で遷移とみなされる(完了遷移)

イベント 外部から自分に届く事象
ガード条件 True or Falseを判定できるもの
アクション 自分が実行すること 例/カウンタ++、/LEDを点灯する


~p14 演習~
光色切替LED電球の例
近くの人と議論しながらレビュー力を高め、その後解答例の説明を行い、1コマ目は終了