IT用語集

シーケンス図とは? 10分でわかりやすく解説

水色の背景に六角形が2つあるイラスト 水色の背景に六角形が2つあるイラスト
アイキャッチ
目次

UnsplashArtur Voznenkoが撮影した写真 

システム開発では「誰が、いつ、誰に、何を依頼し、何が返るのか」という相互作用の理解が品質を左右します。しかし実装や仕様が複雑になるほど、文章や口頭だけでは認識差が生まれやすく、手戻りの原因にもなります。この記事ではシーケンス図(UMLの相互作用図)をテーマに、基本要素、読み方・描き方、典型的な落とし穴、要件定義やテスト設計での使いどころまでを解説します。

シーケンス図とは

シーケンス図の定義

シーケンス図とは、システムの動作や処理の流れを時系列(上から下)に沿って視覚的に表現する図です。登場人物(ユーザー、画面、API、DBなど)を横方向に並べ、やり取りをメッセージ(呼び出し/通知/応答)として矢印で表現します。これにより「どの順番で」「どのコンポーネントが」「どこまで責務を持つか」を具体的に示せます。

実務では、詳細なクラス設計の前に「主要シナリオの会話」を整えるために使われることが多く、特に外部API連携非同期処理例外時の振る舞いなど、文章だと誤解されやすい領域で効果が出ます。

シーケンス図がUMLの一部であること

シーケンス図は、ソフトウェア設計で広く使われる統一モデリング言語(UML)の一種(相互作用図)です。UMLは「図の読み方・記号・表現」を標準化することで、組織やツールが違っても意思疎通しやすくするための枠組みです。

ただし現場では、UML仕様の厳密さよりも「誤解されにくい表現になっているか」を優先するのが一般的です。クラス図やユースケース図、アクティビティ図などと併用し、シーケンス図は「処理の会話(時系列)」に集中させると、役割分担が明確になります。

シーケンス図の目的と重要性

シーケンス図の目的は、設計を“きれいに描く”ことではなく、合意形成と手戻り削減にあります。特に次のような局面で価値が出ます。

  1. 関係者間で「処理の順序」「責務」「前提条件」を共通理解にする
  2. 仕様の穴(例:失敗時の戻り値、タイムアウト、リトライ)を早期に見つける
  3. 並行処理・非同期処理・外部連携の“勘違い”を減らす
  4. 実装・テスト・運用の観点で、観測点(ログ/監視)を設計に織り込む

また、シーケンス図は仕様変更や機能追加の影響範囲を言語化する際にも有効です。「このメッセージが増える」「この応答が変わる」という単位で議論できるため、改修の見積もりやレビューがしやすくなります。

シーケンス図の構成要素

シーケンス図の理解は「登場人物(横)」「時間(縦)」「会話(矢印)」の3点に集約されます。ここでは、図を読み書きするために押さえておきたい要素を整理します。

ライフラインと参加者の考え方

シーケンス図では、シナリオに登場する参加者(participant)を上部に並べ、そこから下方向に伸びる線をライフラインとして描きます。ライフラインは「その参加者がシナリオ上に存在している期間」を表します。

参加者の粒度は重要です。例えば「画面」「API」「DB」は分かりやすい一方、詳細化しすぎると図が破綻します。迷ったら、まずは境界(UI)/制御(API・サービス)/実体(DB・外部サービス)の3層を意識し、議論したい責務の境界が見える粒度にします。

オブジェクトの表現方法

参加者は、図の上部にある長方形(ヘッダー)で表現します。UMLでは「インスタンス名:クラス名」のような表記も可能ですが、実務では理解優先で「UI」「OrderService」「DB」など役割名で描くことも多いです。

クラス/インスタンスの厳密さよりも、「誰が責務を持つか」が伝わる名称にすることが、レビューの品質を上げます。たとえば「API」よりも「AuthAPI」「PaymentAPI」の方が、議論が具体化します。

メッセージの種類と表記

オブジェクト間のやり取りはメッセージとして表現します。代表的な表現は次の3つです。

  1. 同期メッセージ(実線矢印):呼び出し側が処理完了を待つ(例:関数呼び出し、HTTPリクエスト)
  2. 非同期メッセージ(破線矢印または開いた矢印):呼び出し側が待たない(例:イベント発行、キュー投入)
  3. 戻り(応答)(点線矢印):呼び出し元へ結果が返る(例:レスポンス、戻り値)

メッセージ名は矢印の近くに記載し、必要があれば引数や結果の要点を併記します。例えば「createOrder(request)」「200 OK / orderId」などです。ここで重要なのは「呼び出しが成功したとき」だけでなく、失敗時の応答(例:400/401/409/500、タイムアウト)も描くことです。

アクティベーションの意味

ライフライン上の細長い長方形はアクティベーション(実行区間)で、その参加者が処理を実行している期間を示します。アクティベーションを描くと「どこで処理が滞留しうるか」「どこで待ちが発生するか」を議論しやすくなります。

たとえば、外部API呼び出しが同期で長時間待つ場合、アクティベーションが伸びて見えます。これがそのまま「タイムアウト設計」「リトライ設計」「非同期化」の検討ポイントになります。

フラグメントで分岐・繰り返し・並行を表す

複雑な振る舞いは、フラグメント(fragment)で表現すると読みやすくなります。代表例は以下の通りです。

フラグメント用途使いどころの例
alt条件分岐ログイン済み/未ログインで処理が分かれる
opt条件付き実行入力があるときだけ追加検証する
loop繰り返しページング、リトライ、複数アイテム処理
par並行複数の外部APIを同時呼び出しする

フラグメントは点線の枠で囲い、どの条件でどのメッセージ群が実行されるかを示します。フラグメントを入れる目的は、図を難しくすることではなく、「分岐の条件」と「分岐後に何が起きるか」を明示することです。

シーケンス図の作成手順

シーケンス図は「きれいに描く」よりも「合意形成の材料にする」ことが重要です。ここでは、実務で手戻りを減らしやすい作り方の手順を紹介します。

手順1:シナリオとゴールを1つに絞る

最初に、1枚の図で扱うシナリオを明確にします。例えば「ログイン」「注文確定」「パスワード再設定」などです。欲張って複数のユースケースを1枚に入れると、分岐が増えて読みづらくなります。

シナリオは「開始条件」「終了条件」「成功の定義」をセットで書き出すと、図に落とす際の迷いが減ります。

手順2:参加者(登場人物)を洗い出し、粒度を決める

次に、シナリオに関与する参加者を列挙します。ここで重要なのは、設計上の責務が議論できる粒度にすることです。例えば「DB」だけだと曖昧なら、「UserDB」「OrderDB」に分けると議論が具体化します。

一方で、内部モジュールまで細分化しすぎると図が破綻します。まずは「UI/API/DB/外部サービス」のような大枠で描き、必要に応じて分解する流れが現実的です。

手順3:成功パスを上から下へ描く

まずは成功パス(正常系)を時系列で描きます。ここではメッセージを細かくしすぎず、「呼び出しの単位」を意識します。例えば、DBの内部クエリをすべて描くより、「getUser」「saveOrder」など意味のある単位で描く方が理解が早いことが多いです。

また、応答(戻り)を省略すると誤解が起きやすいため、重要なメッセージには「何が返るか」を明示します。HTTPならステータス、ドメイン処理なら結果(ID、状態、エラー)を短く書きます。

手順4:例外系・代替パスをフラグメントで追加する

次に、失敗時や条件分岐を追加します。特に現場で抜けやすいのは、次のような代替パスです。

  • 入力不正(バリデーションエラー)時に、どこで弾くか
  • 認可(権限)不足時に、どの応答を返すか
  • 外部API障害時に、タイムアウト・リトライ・フォールバックをどうするか
  • 二重送信・競合(同時更新)時に、どんな整合性制御をするか

これらは「実装してから気づく」と手戻りが大きい領域なので、シーケンス図で先に議論しておくと効果が大きいです。

手順5:レビュー観点(責務・境界・観測)を図に織り込む

最後に、図をレビューしながら「責務の境界」「運用の観測点(ログ・メトリクス)」「テスト観点」を盛り込みます。たとえば、外部API呼び出しの前後に「requestIdを付与」「失敗時のログに何を残す」などを検討すると、運用での原因追跡が容易になります。

シーケンス図の活用方法

システムの動作を可視化し、認識差を減らす

シーケンス図は、処理の流れを可視化することで、関係者全員が「どの順序で何が起きるか」を具体的に共有できます。特に、複数チーム(フロントエンド/バックエンド/インフラ/外部ベンダー)が関わる場合、文章だけで合意するのは難しく、図が共通言語として機能します。

要件定義・仕様調整のコミュニケーションに使う

要件定義では「やりたいこと」は語れても、「例外時にどうするか」「責務はどこか」が曖昧になりがちです。シーケンス図で具体的に会話を描くと、仕様の穴(例:タイムアウト時のユーザー体験、再試行の可否)が見つかりやすくなります。

また、顧客や非エンジニアの関係者と共有する場合は、記号を厳密にしすぎず、参加者名を分かりやすくし、重要メッセージに説明を添えると、合意形成が進みます。

実装の整合性チェックに使う

シーケンス図は、実装レビューの観点にもなります。「図の通りに呼び出しが行われているか」「責務が境界を越えていないか」を確認できるため、アーキテクチャの逸脱を早期に検知しやすくなります。

一部のUMLツールにはコード生成機能もありますが、現実にはフレームワークや設計方針に合わせた調整が必要です。コード生成は「たたき台」として扱い、最終責任は設計・実装側が持つ前提で運用するのが安全です。

テストケース設計の起点にする

シーケンス図は「分岐」「例外」「外部連携」を含むため、テストケース設計と相性が良いです。例えば、altで分岐する条件はそのままテスト観点になり、外部APIの失敗パターン(タイムアウト、5xx、レスポンス不正)は、スタブ/モックを使った検証項目になります。

また、図とテストケースを対応付けておくと「どの仕様を検証しているか」が説明しやすくなり、レビューや監査にも強くなります。

シーケンス図を使うときの注意点

「細かく描きすぎる」と読む人がいなくなる

シーケンス図は細部まで描こうとすると、瞬間的に読めない図になります。レビュー対象が要件合意なら、DB内部の詳細なクエリや内部関数呼び出しまで描く必要はない場合が多いです。目的に合わせて粒度を調整し、「合意したい範囲」を超えないようにします。

非同期処理は「待たない」ことを明示する

キューやイベント駆動を使う場合、同期の矢印で描くと「待つ」と誤解されます。非同期は非同期として表現し、必要なら「結果は後で通知」「整合性は最終的に一致(Eventually Consistent)」などの補足を入れます。

例外系を省略すると、本番障害の想像力が落ちる

正常系だけの図は見栄えが良い一方、現実の障害や運用を反映できません。最低限、入力不正、認証・認可、外部依存障害、競合・二重送信など、現場で頻出する失敗を図に入れておくと、設計の強度が上がります。

まとめ

シーケンス図は、システムの動作を時系列で表現し、オブジェクト(参加者)間のメッセージのやり取りを可視化するUMLの相互作用図です。正常系だけでなく、条件分岐や失敗時の振る舞いまで含めて描くことで、要件定義・設計・実装・テスト・運用の各段階で認識差を減らし、手戻りを抑えられます。粒度を目的に合わせて調整しながら、チームの共通言語として活用することが、設計品質とコミュニケーションの改善につながります。

シーケンス図に関するよくある質問

Q.シーケンス図はどの工程で作るのが効果的ですか?

要件定義から基本設計の段階で主要シナリオを描くのが最も効果的です。

Q.シーケンス図とフローチャート(アクティビティ図)の違いは何ですか?

フローチャートは処理手順、シーケンス図は参加者間のメッセージの順序を中心に表します。

Q.参加者(オブジェクト)の粒度はどう決めればよいですか?

責務の境界が議論できる粒度にし、細かすぎて読めないレベルまで分割しないのが原則です。

Q.同期と非同期は必ず描き分けるべきですか?

はい。待つか待たないかは設計と性能に直結するため必ず区別して表現します。

Q.戻りメッセージ(応答)は省略してもよいですか?

重要な呼び出しでは省略しない方が安全で、何が返るかを短く書くのが有効です。

Q.例外系はどこまで描けばよいですか?

入力不正、認証・認可、外部依存障害、競合・二重送信など頻出パターンは最低限描きます。

Q.フラグメント(alt/opt/loop/par)はいつ使うべきですか?

条件分岐や繰り返し、並行処理が仕様の論点になるときに使うべきです。

Q.シーケンス図からコードを自動生成できますか?

ツールによっては可能ですが、生成物はたたき台として扱い手作業で整合を取ります。

Q.テスト設計にどう活用できますか?

分岐条件と例外パスをそのままテスト観点に落とし込み網羅性を高められます。

Q.読み手に伝わるシーケンス図にするコツはありますか?

目的に合わせて粒度を揃え、重要メッセージの入力・出力と失敗時の挙動を明示します。

記事を書いた人

ソリトンシステムズ・マーケティングチーム