実際に、要求仕様から状態遷移表を作成するプロセスを紹介する。モデリングを行いながら、要求仕様書で定義されていない曖昧な部分を検討し、明確化。上流工程の段階でモデルを洗練しておくことで、無駄のない最適なソースコードを作成できる。
組み込みソフトウェアが抱える一番の課題は「設計品質の向上」です。本連載の主役「状態遷移表」であれば、“イベント”と“状態”の全ての組み合わせを捉えることができるため、「モレ」「ヌケ」のない品質の良い設計が可能です。そして、不具合発生による手戻りコストの削減や開発効率の向上にも役立ちます。
こうした理由から、組み込みソフトウェア開発の世界では、長年、状態遷移系モデルで設計が行われています。
さて、前回は“なぜ状態遷移表を使うと、品質の良い開発ができるのか”を紹介しました。今回は「状態遷移表を使用した要求分析モデル」をテーマに、具体的に要求仕様から状態遷移表を作成するプロセスを紹介したいと思います。
なお、本連載では以下の6つのテーマを順番にお届けしていきます。
状態遷移系モデルは、デジタルカメラ、ビデオカメラ、メディアプレーヤー、エアコン、冷蔵庫などの家電製品をはじめ、OA機器、半導体製造装置、情報機器、医療機器、航空/宇宙関係、車載システムなど、あらゆる分野で適用されています。というよりも、組み込みシステムで“状態のないシステム”はほとんど皆無といってよく、状態遷移表設計手法が使われていない分野を探す方が難しいといっても過言ではありません。
各分野によって適切なサンプルは異なるかと思いますが、今回は「キッチンタイマー」を題材にしてモデリングを行い、要求分析をしていきたいと思います。
モデリングするキッチンタイマーの要求仕様書を図1に示します。この要求仕様は、キッチンタイマーの基本機能を示す「基本仕様」と、「時間設定仕様」部分の2つに分けて記述されています(補足)。要求分析モデルでは、まず、要求仕様の中で基本機能の要求を分析してみましょう(図1の赤枠内)。
図2は、一般的な要求分析モデリングのプロセスです。
始めに、仕様書からイベントを抽出し、イベントリストを作成します。次に、状態を抽出し、状態遷移図を作成します。状態遷移図は、“状態の遷移(流れ)に着目した表記”であるため、これを基に要求仕様に記されていなかった“遷移モレ”の確認を行います。そして、状態遷移図を最適化してモデルを洗練します。その後、状態遷移図から状態遷移表に変換します。状態遷移表は、“イベントと状態の組み合わせを全て表現した表記”であるため、これを使用することにより、全てのイベントに対する“アクション(処理)”を、モレ・ヌケなく定義できます。そして最後に、状態遷移表を最適化してモデルの洗練を行います。
それでは、イベント抽出を行うために、基本仕様を参照してイベントリストを作成しましょう。イベントリストには、イベント、スティミュラス、レスポンス、エフェクトなどを記述する場合もありますが、今回は、状態遷移表設計手法で重要となる「イベント」と「アクション」についてのみ考えます。
まず、要求仕様書の基本仕様部分を参照してみると、「時間設定ボタン(分、10秒、クリア)により、カウントダウン時間設定を行う」と記述されています。これは、「時間設定ボタン」というイベントにより、「カウントダウン時間設定を行う」というアクションを実行することを意味します。よって、イベントには、「時間設定ボタン」と記述します。これと同様に、「スタートストップボタン」「カウントダウン終了」についても記述します(図3)。
次は、イベントリストのアクションについて考えてみましょう。
要求仕様書の基本仕様部分を参照してみると、「時間設定ボタン(分、10秒、クリア)により、カウントダウン時間設定を行う」と記述されています。先にも説明しましたが、これは「時間設定ボタン」というイベントにより、「カウントダウン時間設定」というアクションを実行するという仕様です。よって、アクションには「カウントダウン時間設定」と記述します。これと同様に、全てのアクション部分についても記述します(図4)。
ここまでの流れで、イベントとアクションのみを記述したイベントリストが完成しました。次は、状態を抽出してみましょう。
状態の抽出は、キッチンタイマーの“操作(流れ)”をイメージし、どのような“状態”が必要か、現在どの状態におりどのイベントが入ったらどの状態に遷移していくかなどを考えながらモデリングしていきます。
それでは、キッチンタイマーの電源が投入された最初の状態から考えてみましょう。
モデリングを行う際は、まず、考えられる状態をできるだけ多く抽出し、後から不要な状態を削除する方針でモデリングしていく手法と、始めから状態をなるべく少なく抽出し、後から追加する方針でモデリングしていく手法がありますが、今回は、前者の“状態をできるだけ多く抽出し、後から不要と思えるものを削除する”方針でモデリングしていきたいと思います。
まずは、「初期」状態という、何もボタンが押されていない状態を“1つの状態”と考え、作成します。そして、次は、イベントリストを参照し、イベントが発生した際の状態遷移を考えながら状態を抽出していきます(図5)。
イベントリストを参照してみると、「時間設定ボタン」イベントが入った場合は、「カウントダウン時間設定」を行う仕様となっています。そのため、新たに時間設定を行う「時間設定」状態を作成し、「初期」状態から、「時間設定ボタン」イベントが入った場合は、「時間設定」状態に遷移するように記述します(図6)。
続いてイベントリストを参照してみると、時間設定が完了しているときに、「スタートストップボタン」イベントが入った場合は、「カウントダウン開始」を行う仕様となっています。そのため、新たにカウントダウン(時間計測)を行っている「カウントダウン」状態を作成し、「スタートストップボタン」イベントが入力された場合は、「カウントダウン」状態へ遷移するように記述します(図7)。
再度、イベントリストを参照してみると、カウントダウン中に、「スタートストップボタン」イベントが入った場合は、「一時停止」を行う仕様となっています。そのため、新たに一時停止を行っている「一時停止」状態を作成し、「スタートストップボタン」イベントが入力された場合は、「一時停止」状態へ遷移するように記述します(図8)。
そして、再びイベントリストを参照してみると、カウントダウンが終了した場合、「カウントダウンを停止し、アラーム音を出力する」仕様となっています。そのため、新たにアラーム音を出力している「アラーム音出力」状態を作成し、「スタートストップボタン」イベントが入力された場合は、「アラーム音出力」状態へ遷移するように記述します(図9)。
最後に、イベントリストを参照してみると、アラーム音出力中に、「スタートストップボタン」イベントが入った場合は、「アラーム音停止」を行う仕様となっています。その際、遷移先は何処にすべきでしょうか。
再び、時間設定を行い、カウントダウン(時間計測)を行う場合、「初期」状態に遷移するべきです。また、時間設定を行わずに、カウントダウン(時間計測)を行う場合は、「時間設定」状態に遷移するべきです。そのため、迷ってしまいます。
ここでは、「時間設定」状態に遷移することとします。次は、「時間設定」状態において、再び、時間設定を行い、カウントダウン(時間計測)を行う場合の処理を含めて検討します(図10)。
Copyright © ITmedia, Inc. All Rights Reserved.