「ソフテックだより」では、ソフトウェア開発に関する情報や開発現場における社員の取り組みなどを定期的にお知らせしています。
さまざまなテーマを取り上げていますので、他のソフテックだよりも、ぜひご覧下さい。
ソフテックだより(発行日順)のページへ
ソフテックだより 技術レポート(技術分野別)のページへ
ソフテックだより 現場の声(シーン別)のページへ
私はソフテックに入社して20年近く経ちます。主に組み込み系のソフト開発に携わっています。
入社4年目の頃に今回の技術レポートのテーマである状態遷移表を元にソフト開発を行いました。その開発では先輩社員が設計を行い、その設計資料を元に私がソフト作成しました。状態遷移表を元にソフトを作っていきましたが、その時は「状態遷移表があるとプログラムコードを組みやすいな」と感じたくらいでした。
それから自分で設計してソフト開発する機会が増えていきましたが、開発の中盤・終盤で、「この条件の時に正常に動かない」といった問題が発生したことがありました。設計の抜け漏れに気付かずにソフト開発を進めていたためです。社内レビューを行ったところ、異常処理の考慮不足との指摘があり、状態遷移表を作成したほうが良いとのアドバイスを受けました。状態遷移表を作成したところ、考慮できてない条件がいくつもあったことが判明しました。
このことがきっかけとなり、設計の抜け漏れを防ぐために状態遷移表を作成してからソフト開発を行うことが多くなりました。
今回は状態遷移表による設計について紹介します。
状態遷移とは、ある状態が変移して別の状態になることです。
この状態の遷移を表現するために使われる図のことを状態遷移図、表形式のものを状態遷移表と呼びます。
図 1に示した図が状態遷移図です。「状態」を円、「遷移」を矢印で表しています。矢印の横の文字ですが、前半が状態遷移のきっかけとなるイベント(事象)で後半が遷移する前に実行する処理名です。
例えば、「状態1」のときに「イベントA」が発生すると「処理a」を実行し、「状態2」に遷移するという赤色矢印の動作になります。
図1. 状態遷移図説明
次に状態遷移表について説明します。
表 1に示した表が状態遷移表です。図 1と同じ動作内容です。
横軸に「状態」、縦軸に「イベント」を記載します(逆のケースもあります)。「状態」と「イベント」が交差している欄が上下に分かれていますが、上段はイベントが発生したときに実行する処理名で、下段は処理実行後に遷移する状態です。
例えば、「状態3」のときに「イベントC」が発生すると「処理d」を実行し、「状態1」に遷移するという赤色枠の動作になります。
何もしない場合は欄を斜線、組み合わせとしてあり得ない場合は×線にします。
表1. 状態遷移表説明
状態遷移図は状態の流れを表現しており、直感的に概要を把握できるため要求分析フェーズに適しています。
状態遷移表は全てのイベントと状態の組み合わせを表現しており、漏れや抜けを発見することができるため設計フェーズに適しています。
次に実際に状態遷移を使った設計例について説明します。
ストップウォッチを例に説明します。ストップウォッチの仕様を以下に示します。
状態は、入力に対する出力の変化に注目して抽出します。同じ入力に対して異なる出力となる場合に、状態が存在すると推察できます。
仕様の「スタート/ストップボタン」を押下(入力)したときで考えると、「計測開始する」、「計測一時停止する」、「計測再開する」という異なる動作になるため、「スタート/ストップボタン」だけでも2つ以上の状態があると推察できます。
また、状態には以下のことがいえます。
今回のストップウォッチの仕様では「待機中」、「計測中」、「一時停止中」の3つの状態を抽出しました。
「イベント」は1次入力信号と2次入力信号に注目して抽出します。
1次入力信号はシステムへの直接の入力信号で、スイッチ入力のイベントなどが該当します。
2次入力信号は1次入力信号を用いて作られた信号で、条件が揃った時のイベントなどが該当します。例えば、今回の仕様にはありませんが、ストップウォッチにカウントダウンタイマ機能があればタイムアップというイベントが必要になります。
今回のストップウォッチの仕様では「スタート・ストップボタン押下」、「リセットボタン押下」の2つのイベントを抽出しました。
抽出した状態とイベントを元に作成した状態遷移図を図 2に、状態遷移表を表 2に示します。
図2. ストップウォッチの状態遷移図
表2. ストップウォッチの状態遷移表(空欄あり)
状態遷移表の赤色枠が空欄になっていますが、今回のストップウォッチの仕様では以下の点が明確にされていなかったことが分かります。
待機中状態に「リセットボタン」が押下されたときは、計測が始まっていないので「何もしない」となります。
計測中状態に「リセットボタン」が押下されたときの動作ですが、リセット操作を優先にする場合は計測表示クリアして「待機中」状態へ遷移、計測を優先する場合は、「何もしない」となります。
どちらを優先するかによって内容が変わりますが、今回は計測優先とし、「何もしない」とします。
修正した状態遷移表は表 3になります。
表3. ストップウォッチの状態遷移表(修正後)
ラップ機能などの仕様が追加されていったとき、状態とイベントが増え、組み合わせも増えていきます。制御系の組み込みソフトは異常処理が重要となりますが、状態遷移表を使って全てのイベントと状態の組み合わせを確認することで、異常処理の漏れや抜けを防ぐことができると考えます。
今回は状態遷移表による設計手法を紹介しました。
設計方法の1つとして参考にしていただき、設計の抜けや漏れによる手戻りを防げればと思います。
なお、作成した状態遷移表から自動で状態遷移の動作を行うコードを生成してくれる市販ソフトもあります(フリーソフトがあるかは不明です)。弊社でも簡易的ではありますが、EXCELに書いた状態遷移表からC言語のコードを自動で生成するツールを作り、ソフト開発したことがあります。
(M.A.)
関連ページへのリンク
関連するソフテックだより