シーケンス図

シーケンス図は、時間の経過に伴うオブジェクトのインタラクションを視覚化します。特定のタスクやシナリオを達成するためにパーティシパント間で交換されるメッセージの順序を示します。

基本概念

パーティシパント

パーティシパントは、インタラクションに関与するオブジェクトやアクターを表します。各パーティシパントには、時間を表す下向きに延びる垂直の破線であるライフラインがあります。

メッセージ

メッセージはパーティシパント間のコミュニケーションで、ライフライン間の水平矢印として表示されます。時間は上から下に流れます。

アクティベーションボックス

アクティベーションボックス(実行仕様とも呼ばれる)は、パーティシパントがアクティブに処理中であることを示すライフライン上の細い矩形です。

パーティシパントの作成

パーティシパントツールの使用

P を押してパーティシパントツールをアクティブにし、キャンバスをクリックしてパーティシパントを配置します。

パーティシパント付きシーケンス図

パーティシパントのタイプ

パーティシパントはさまざまなエンティティタイプを表現できます:

  • アクター - ユーザーまたは外部システム(棒人間アイコン)
  • オブジェクト - クラスのインスタンス(矩形)
  • コンポーネント - システムコンポーネント(ステレオタイプ付き矩形)
  • バウンダリ - UI またはシステムの境界
  • コントロール - プロセスまたはコントローラのロジック
  • エンティティ - データまたはドメインオブジェクト

インスペクタパネルでパーティシパントのタイプを設定します。

メッセージの作成

メッセージツールの使用

M を押してメッセージツールをアクティブにし:

  1. ソースパーティシパントのライフラインをクリック
  2. ターゲットパーティシパントのライフラインまでドラッグ
  3. リリースしてメッセージを作成

メッセージタイプ

タイプ矢印スタイル説明
同期実線、塗りつぶし矢印送信者が応答を待つ
非同期実線、開いた矢印送信者が待たずに続行
返信破線、開いた矢印同期呼び出しへの応答
作成破線、ボックスへの開いた矢印新しいパーティシパントを作成
破棄X で終わる線パーティシパントを終了

メッセージタイプ

メッセージラベル

メッセージをダブルクリックしてラベルを編集。一般的な形式:

  • methodName() - シンプルなメソッド呼び出し
  • methodName(param1, param2) - パラメータ付き呼び出し
  • result := methodName() - 戻り値の代入付き呼び出し
  • [condition] methodName() - 条件付きメッセージ(ガード)

アクティベーションボックス

アクティベーションボックスは、パーティシパントが実行中または応答を待っている期間を表示します。

アクティベーションボックスの追加

  1. メッセージを選択
  2. インスペクタで「アクティベーションを表示」を有効にする
  3. 受信パーティシパントのライフラインにアクティベーションボックスが表示される

ネストされたアクティベーション

パーティシパントが自身を呼び出す場合(再帰呼び出し)や、複数のネストされた呼び出しを処理する場合、アクティベーションボックスを重ねることができます。

アクティベーションボックス

フラグメント

フラグメントは、条件付きロジック、ループ、その他の制御フローを示すためにメッセージをグループ化します。

フラグメントタイプ

タイプキーワード目的
代替altif-else 分岐
オプションoptオプショナルな実行(else なしの if)
ループloop繰り返し実行
ブレークbreak囲んでいるループからの脱出
並列par並行実行
クリティカルcriticalアトミック/クリティカルセクション

フラグメントの作成

  1. グループ化したいメッセージを選択
  2. 右クリックして「フラグメントを追加」を選択、またはフラグメントツールを使用
  3. フラグメントタイプを選択
  4. 必要に応じて条件/ガードを追加

フラグメントの例

フラグメントのガード

ガードは角括弧で表示される条件です:

  • [x > 0] - 数値条件
  • [user.isAdmin] - プロパティチェック
  • [else] - alt フラグメントのデフォルト/else 分岐

要素の並べ替え

パーティシパントの移動

パーティシパントを水平にドラッグして順序を変更します。接続されたメッセージも追従します。

メッセージの移動

メッセージを垂直にドラッグしてシーケンス内の順序を変更します。これはインタラクションのタイミング/順序に影響します。

ベストプラクティス

  1. メインフローから始める - まず正常系をモデル化し、その後に代替を追加
  2. 読みやすさを保つ - ダイアグラムごとに5〜7パーティシパントに制限
  3. 意味のある名前を使用 - メッセージには実際のメソッド名や説明をラベル付け
  4. 返信メッセージを表示 - 特に戻り値が重要な同期呼び出しの場合
  5. フラグメントは控えめに使用 - ネストが多すぎると読みやすさが低下
  6. メモを追加 - 複雑なロジックを説明するためにメモ要素を使用

例:ユーザーログインフロー

典型的なログインシーケンスは以下を含みます:

  1. ユーザーが認証情報を入力
  2. クライアントがサーバーにログインリクエストを送信
  3. サーバーがデータベースで検証
  4. データベースがユーザーレコードを返す
  5. サーバーがセッションを作成
  6. サーバーがクライアントに成功/失敗を返す
  7. クライアントが UI を更新

このフローは、同期呼び出し、返信メッセージ、および成功/失敗パスの alt フラグメントの可能性を示しています。