はじめに
こんにちは!今回はUMLSysmlの学習の一環として状態遷移図を学んできました!学生の頃に少し触りましたが知らない構成要素もたくさんありました...そんな状態遷移図についてまとめていきます!
状態遷移図とは
状態遷移図は、システムのライフサイクルや動作を視覚的に表現するツールです。システムの振る舞いや状態の変化を整理しやすくするため、設計段階でよく使用されます。また、状態遷移図を使うことで、システムの挙動が明確になり、コードに落とし込みやすくなります。
例えば、車のエンジンシステムを考えた場合、以下のような状態と遷移条件が挙げられます。
例: 車のエンジン状態
- 状態: エンジンオフ、エンジンオン、走行中、停止
- 遷移条件: スタートボタンを押す、アクセルを踏む、ブレーキを踏む、終了
状態遷移図の基本的な構成要素
状態遷移図は以下の要素から構成されます。
-
開始状態
システムの最初の状態。システムが動作を開始する際にどの状態から始まるかを示します。 -
状態
システムが取ることができる各状態。そのまんまです。例えば、「エンジンオフ」など。 -
合成状態
状態遷移図内で、複数の状態をまとめて1つの大きな状態として扱うものです。すべての状態を一つの大きな図として表現すると、状態遷移がごちゃごちゃになり、理解が難しくなることがあります。パソコンのファイルのように整理が必要です。状態の管理を簡素化し、可読性を向上させます。上記図では「エンジンオン」が合成状態にあたります。 -
入場点
合成状態内に入る際の最初の状態のことです。図では開始状態と同じ記号で表されますが、開始状態は図中に1つしか存在しません。別物です。上記図ではエンジンオン内の●がこれにあたります。 -
退場点
合成状態から出る際の最後の状態のことです。 -
終了状態
システムが最終的に到達する状態のことです。ここに達すると二度と他の状態には遷移することはありません。
簡単な状態遷移図は上記の要素で構成されますが、よりテクニカルな要素もあります。
テクニカルな要素
-
平行状態
複数の状態が同時に存在する場合に使用します。例えば、システムの異なる部分が独立して動作する場合に適用されます。状態遷移図における平行状態を使うことで、並列的な処理やフローを管理することができます。 -
浅い履歴
合成状態を離れた後、再度その合成状態に入るときに、最後に実行された状態を再開する機能です。これにより、再度合成状態に戻った時に最初からではなく、前回の状態から処理を再開できます。 -
深い履歴
状態遷移が複数の階層にわたる場合に適用されます。合成状態内の状態に加えて、その状態内で履歴を管理することができ、より精緻な管理が可能となります。 -
停止状態
システムのライフサイクルが終了したときの状態です。状態遷移図における終了状態は、システムが完全に動作を終えたことを示します。
状態遷移表
状態遷移図と似たような用語に状態遷移表というものがあります。もちろん名前からどのようなものかは想像できるのですが、どのように使い分けるのでしょうか?
状態遷移表の特徴としては以下が挙げられます。
- 詳細に遷移条件を定義できる
- 表であるから図と比較すると構造が簡単
- 遷移が起こらない組み合わせも一目で把握することができる
そのため以下のように使い分けます
状態遷移表
- 状態遷移の個数が多いとき
- どの状態からどの状態へ状態遷移するのかを詳細に見たい場合
- 仕様の全体像を把握したいとき
状態遷移図
- イメージの共有をしたいとき
- 流れを視覚的に確認したいとき
システムを構成するときやテストするときには、全体を知りたい、詳細を知りたいといった状況が両方あると思うため状態遷移図、状態遷移表、両方使えるようにしておくことは必須だと思います。
状態遷移図をさらに活用するために
以下にChatGPTに状態遷移図を使う上でのアドバイスを聞いてみたので張り付けおきます。
状態遷移図はシステムの設計において非常に重要なツールですが、実際にそれを活用するためには、以下の点を意識すると良いです。
シンプルに保つ
状態遷移図が複雑になると、逆にその理解が難しくなります。状態を適切に整理し、必要のない詳細な状態遷移は省略するようにしましょう。合成状態を活用する
複雑なシステムを管理するためには合成状態を活用することが重要です。合成状態を使って階層的に管理することで、全体を簡潔に理解できます。状態間の遷移を明確にする
各状態間の遷移条件やイベントを明確に定義し、システムの動作が予測できるようにしておきましょう。
おわりに
今回はPowerPointではなく、PlantUMLを用いて状態遷移図を作成してみました。前回のものと比べると圧倒的に見やすいと思います。
自分流ではなく、世の中でよく使われているツールを活用することの重要性を改めて感じました。今後も必要な知識を取り入れていき、またその過程で世の中で広く使われているものの取り入れを行い、良いエンジニアライフを送っていきたいと思います。最後まで読んでいただきありがとうございました!