IT業界は専門用語のオンパレード、常に職場ではカタカナ言葉が飛び交います。はじめてIT業界に足を踏み入れた人はびっくりしますよね。
研修が充実していたり、指導役の先輩が常に指導したりしてくれるなら良いですが、教えてもらったからすぐにできる、理解したというわけではありません。用語の理解はもちろんですが、実際に使ってみる事がとても大切です。
この記事ではUML(統一モデリング言語)の1つである「シーケンス図」について、用語の意味から作り方、作るときの注意点まで、初心者でも分かりやすく解説します。
目次
シーケンス図とは
シーケンス図とは「プログラムの処理の流れや概要」を設計する際に使われます。オブジェクト指向のソフトウェア設計においては、グローバルスタンダードの設計手法と言っても過言ではありません。
プログラムの処理の流れや概要について、具体的には「クラスやオブジェクト間のやり取り」を「時間軸に沿って」、図で表現します。UMLの中では「相互作用図」の1つに位置付けられています。
なお、シーケンス図はシステム設計時のみならず設計書の無い既存システムの分析(リバースエンジニアリング)にも使われることがあります。
シーケンス図のメリット
シーケンス図を作成するメリットは、主に以下の3つです。
プログラムの処理概要が整理できる
システムが巨大化・複雑化するほど実行手順が増えていきます。仕様書無しは論外ですし、文字ベースの仕様書にしても読み解くのに時間がかかります。また、記述漏れやミスの発見が難しいのも難点です。
シーケンス図は視覚的に、共通の記述ルールにもとづいてシステム処理の流れを把握することができます。ロジックの流れが明確になるので、プログラムの概要および処理手順について、早く正確に理解することができます。
仕様レビューと顧客へのエビデンス
共通のルールに基づいて記述されるシーケンス図は、システムの仕様レビューを効率的に実施するのに役立ちます。また、意外なことにクライアントへの説明にもシーケンス図は有用です。
グラフィカルにシステムの処理手順を示しているシーケンス図は、非エンジニアやITについて詳しくない人でも比較的理解しやすいです。
クライアントとシステムのイメージを共有しておくことは、後のトラブルを防ぐ意味でも重要です。設計初期の段階でクライアントと成果物に求める役割を明確化し、開発終盤での仕様変更リスクを下げましょう。
保守・追加開発時に仕様が確認できる
シーケンス図が活躍するのはシステム開発の時だけではありません。システム納品後の保守運用フェーズにおいてもシーケンス図は重宝します。
保守運用担当者の多くは、開発者とは別人です。トラブル発生時にコードを1から解読するのはとても非効率です。シーケンス図があればシステムの仕様を早期把握し、解決に向けての施策をスムーズに実施することができます。また同じ理由で、システムを仕様追加する際にもシーケンス図は有効です。
シーケンス図のデメリット
際立ったデメリットはありません。強いて言うのであれば、シーケンス図の作成コストがかかる点、仕様変更時にドキュメント更新が必要な点でしょう。
ただし上述したように、シーケンス図によってクライアントとの認識違いによる納品トラブルを回避することができます。この点を考慮すれば、実質シーケンス図を作成するデメリットは無いに等しいと言って良いでしょう。
ちなみに、シーケンス図の作成・仕様変更コストはツールの導入で負担軽減することも可能です。
シーケンス図の書き方を紹介
シーケンス図の意味や作成するメリットについて理解できたかと思います。次は実際に、シーケンス図を作成するためのルールについて解説します。
最初にシーケンス図で使用する構成要素(図形)の書き方を解説し、次に細かい用語について詳細に解説していきます。
実際にシーケンス図を作成するときにこの記事を参考に記述し、理解を深めていきましょう。
シーケンス図を作成する上でのルールとは
シーケンス図は、ある動作に対するシステム処理の流れを視覚的に表現する手法です。クラスやオブジェクト、処理の記述には特定の図形を使って表現するのがシーケンス図のルールです。
ここで「多少ルールを逸脱してもメンバーは理解できるから良いかな」と考えるのは厳禁です。シーケンス図に限らず、UMLは明確なルールを定める事によって保守性と汎用性の高さと実現した、という歴史的背景があります。
ルールに基づかないシーケンス図は、もはやシーケンス図と呼べません。ルールを守って、よりスキルの高いエンジニアを目指しましょう。
構成要素のルールは4種類
シーケンス図で使用される要素は、大きく分けて「ライフライン」「実行仕様」「停止」「メッセージ」の4種類です。
オブジェクトやクラスを表現するときは「ライフライン」を使用します。箱の中には「オブジェクト名:クラス名」という書き方をしますが、どちらか一方のみの記入でも大丈夫です。
「実行仕様(別名:制御フォーカス)」はライフライン上で処理が実行されていることを意味します。もちろん、実行仕様はライフライン上に設置されます。
「停止」は実行仕様の逆で、ライフラインで処理が行われていないことを意味します。システムの処理が完了し、ライフラインを破棄するときに使用されます。
「メッセージ」は5パターン存在します。「同期」「非同期」「応答」「ファウンド(Found)」「ロスト(Lost)」です。メッセージの概念としては「ライフライン上の処理先に同期されるメッセージ」というイメージです。
「同期」「非同期」は言葉の通り、処理先にメッセージが同期されるかどうかを意味します。「応答」は処理先のライフラインから送り手への戻り値を意味します。「ファウンド」は図にない送り手から送信されたこと、「ロスト」は意図していた処理先に遅れていないことを意味します。
シーケンス図は大きく上記4要素によって表現されています。言い換えれば、この4つを理解していればシーケンス図をある程度読み解くことが可能になります。「まだシーケンス図について理解ができていない」と思う人はここでストップし、上記の内容を理解できるようにしましょう。
処理内容の記号ルールは「複合フラグメント」を参照しよう
シーケンス図をマスターするのであれば、要素についての理解は必須ですが、それだけでは十分ではありません。
要素だけでシーケンス図を作成した場合、システムの処理手順は理解できます。しかし、細かい処理の仕組みや重要な処理をしている部分はどこか、視覚的に判断することができません。
ここで登場するのが「複合フラグメント」です。例えば「ここでは並列処理を実行している」「ループ処理はここ」「ここで条件分岐している」という点が視覚的に判断できれば、シーケンス図がより見やすくなると思いませんか。具体的な処理内容を視覚的に表現するためのルールを「複合フラグメント」と呼びます。
複合フラグメントは、対象にしている処理手順をすべて四角で囲み、左上に処理内容を記入します。詳しくは下記「シーケンス図の書き方」で紹介していきます。
シーケンス図の書き方を紹介
ここからは複合フラグメントを使って、上手にシーケンス図を作成する方法を紹介していきます。
複合フラグメントをつかうだけでシーケンス図の読みやすさが向上します。分かりやすいように、具体的な例を挙げて解説します。イメージしながら読み進めてください。
条件分岐(Alt)の書き方
条件分岐は「Alt」複合フラグメントを使用します。[](ガードという括弧)内に分岐条件を記載し、各処理を点線で区切って記載します。
たとえば、ソーシャルゲームの課金時をイメージしましょう。はじめて課金するときは、生年月日や現在の年齢を打ち込みます。ここで「15歳未満であれば上限1,000円まで」「15歳以上20歳未満で上限1万円まで」「20歳以上で上限なし」など条件が分岐します。
シーケンス図では分岐する処理内容をすべて四角で囲み、左上に「alt」を記入して「この部分は条件分岐処理を表している」ことを明確にします。課金の例では、年齢ごとに3パターンの処理手順が分かれます。それぞれのパターンの処理内容を点線で区切って記載しましょう。
アサーション(Assert)の書き方
アサーションは「処理内容が妥当であるか」をチェックするためのシステムを表します。シーケンス図内で{}内に成立すべき内容を記載します。四角で囲んだ左上に記載する文字は「assert」です。
たとえば出荷管理システムの場合、「現在の在庫数=昨日の在庫数-本日の出荷数」という数式が成立していなければなりません。このチェック機能を果たしている部分を明確にするのが複合フラグメント「Assert」の役割です。
並列処理(Par)の書き方
並列処理はその名の通り、1つのアクションに対して並列で処理が実行される場合に使用します。ECサイトや小売店レジのシステムで「販売確定」の処理が実行された場合、「在庫管理システム」と「会計処理システム」が同時に実行されるイメージです。
並列処理は、四角で囲んだ左上に「par」で記載されます。また、並列で実行される処理は、「条件分岐」と同じように点線で区切られます。
重要処理(Consider)の書き方
重要処理は名前の通り、特に重要な処理をしている部分を表すための複合フラグメントです。重要処理は「有効処理」と表現されることもあります。
四角で囲むときは、左上に「consider{メッセージ1、メッセージ2…}」と記入します。メッセージ内容は「注目すべき処理内容」を記入しましょう。
例えばECサイト・小売店レジのシステムを例に挙げれば、メッセージ内容はConsider{会計システム、在庫管理システム}といった具合です。
不正(Neg)の書き方
不正(Neg)も名前の通り、不正な処理に対してエラーを返す記述部分を表す手法です。エラーを返すシステムの部分を四角でパッケージ化し、左上に「neg」と記入しておきましょう。
不正な処理とは、例えばATMのシステムをイメージすると分かりやすいです。あなたがATMで3万円を出金したのに残高が正しく変化していないと困りますよね。この時にエラーを返すシステムをマークアップしたのが複合フラグメント「不正」です。
もちろん、エラーを返す処理は通常使用されるはずのないシステムです。シーケンス図にまとめたときに、正しい処理に対しても「不正」の処理が実行されないか注意しましょう。
無効(Ignore)の書き方
複合フラグメント「無効(ignore)」は、重要な処理ではないことを視覚的に表現する手法です。システム処理を無効にしているわけではないので注意しましょう。
たとえばWebサイトへの会員登録を呼びかけるときに「現時点で10,512人の方が登録しています!」といったキャッチコピーをサイトに表示している場合もあるでしょう。
ただ、データベースからWebサイトに会員登録数を表示する仕組みは、重要な部分とは言えないないですよね。この場合は会員登録する仕組みのほうが重要です。
条件指定(Opt)の書き方
複合フラグメント「条件指定(Opt)」は「条件が満たされたときに作動するシステム」を表現します。
イメージとしては、免税店のレジが分かりやすいです。商品を購入する人が外国人だった場合、免税ボタンを押して免税システムと連携する、といったイメージです。
条件分岐(Alt)と似ています。違いについて、条件分岐するときは「Aパターン、Bパターン…」と明確に条件を分岐させるのに対し、条件指定は「Aパターンと、それ以外はすべてBパターン」といったイメージです。
外部参照(Ref)の書き方
複合フラグメント「外部参照(Ref)」は、その名の通り「囲まれている部分は別のシーケンス図を参照してください」という意味です。システムが複雑になり、1つのシーケンス図にまとめきれない時に使います。
レジやECサイトのシステムなど、複数の並列処理が実行される場合に外部参照を使用するケースが多いです。
ループ処理(Loop)の書き方
複合フラグメント「ループ処理(Loop)」も名前通り、ループ処理するシステムを表すシーケンス図に使用されます。小売店レジの金額計算システムをイメージしてみましょう。複数の商品がある場合、商品数の数だけ同じ処理を繰り返します。
ループ条件の書き方は、Loop[開始条件、終了条件]です。小売店レジの例だと[1、購入した商品数]で表すことができます。
中断処理(Break)の書き方
複合フラグメント「中断処理(Break)」は、特定の条件を満たしたときに処理を中断するシステムを表します。
倉庫の在庫システムをイメージすると分かりやすいです。在庫数が0になった場合、処理を中断してメッセージを表示する、といったシステムの部分を表します。
排他処理(Critical)の書き方
特定の処理を実行中は他からの処理を受け付けないシステムを、複合フラグメント「排他処理(Critical)」を使って表現しましょう。
たとえば、野球場の使用許可を取るシステムをイメージしましょう。野球場を使用中は、「野球場」クラスは外部からの処理を一切受け付けませんが、予約システムは利用することができます。
このように、予約と使用は並行処理されていますが、使用中の場合に処理が保護されるシステムを「排他処理」を使って表現します。
作成ツールの紹介
シーケンス図はエクセルのオートシェイプを使って独自に作成することが可能です。ただし、馴染みのあるエクセルは使い勝手が良いですが効率性を考えるのであれば専用のツールを導入した方が良いです。
エクセルを使用する場合の導入コストはかかりませんが、リアルタイムでの情報共有という点に弱いです。また、シーケンス図の作成者によって、オートシェイプの表記が統一されないなどのリスクもあり、クオリティにばらつきがあります。
もし本格的にUML図のツールを導入を検討しているのであればCacooがおすすめです。Cacooはクラウドを利用したツールなので、リアルタイムでの情報共有・共同作業に強いです。
テンプレートもあるので、エクセルにありがちな品質のばらつきも抑えることができます。個別権限の設定も可能なので、誤ってメンバーが図を改変するリスクも少ないです。
エクセルは手軽に、かつ自由にシーケンス図を作成できるメリットがあります。しかし、テンプレートやリアルタイム共有を使って作業効率を向上させたい場合はツールの導入がおすすめですよ。
シーケンス図を作成する前に
最後に、シーケンス図を作成する上での注意点と、実際に使用すべき具体的なケースをお伝えします。
シーケンス図作成の注意点とは
シーケンス図を作成するのであれば、必ず「シナリオ」を意識しましょう。具体的には、シーケンス図を作成する前に業務フローを明確にし、「クライアントがどのようなシナリオでシステムを利用するのか」を把握しておきましょう。
よくあるシーケンス図の失敗例は「書き込みすぎ」「複数シナリオの混在」「シナリオが不明確」です。
シーケンス図は分岐を加えることによって、1つの図に対して複数の利用シーンを想定することができます。しかし、シーケンス図にシナリオが複数あると可読性を下げてしまいます。シーケンス図は「この処理をする場合は内部でこう処理される」というように1シナリオのみ書きましょう。
複数シナリオを入れる弊害は他にもあります。それが「書き込みすぎ」です。シーケンス図はやろうと思えばとても具体的に書きこむことが可能です。ただし、詳細な図はかえって分かりやすさを犠牲にする面もあります。どこまで詳しく書き込むかは、シーケンス図を作成する前にあらかじめ責任者と協議しておきましょう。
最後の「シナリオの不明確」については、そもそもシステムベンダー側がクライアントの業務フローを理解していないことが原因です。業務フローをヒアリングし、フローチャートなどを使って開発側と利用シーンについてのイメージを共有しておきましょう。
シーケンス図の具体例を紹介
最後に、シーケンス図を利用すべき具体的なシーンをイメージして終わりましょう。シーケンス図のメリットでも書きましたが、「要件定義」「開発」「保守運用」フェーズで役に立ちます。
要件定義時にシーケンス図を作成し、クライアントと認識を共有すれば後のトラブルを回避することができます。クライアントに見せるシーケンス図は、できるだけ直感的に分かりやすいように書いた方がよいです。設計・保守のためのシーケンス図は別に作成するのも良いです。
また、保守運用するときにもシーケンス図は役立ちます。処理の流れを視覚的に把握できるので、トラブルの迅速な復旧が期待できます。
シーケンス図はほぼどんなプロジェクトでも使用されていますが、まれに小規模プロジェクトだと使用されないことがあります。この場合はシーケンス図作成コストとトラブル・保守性のリスクを考慮して、作成すべきか判断しましょう。
シーケンス図をどんどん使おう
頭の中でイメージしやすいように解説してきましたが、シーケンス図についてなんとなくでも理解できたでしょうか。
はじめはルールや表記方法に戸惑うかもしれませんが、いろいろなシーケンス図を読み、自分で作っていくうちに上手くシーケンス図を使えるようになります。
書き方が分からなくなった時は再びこの記事を参考にして、ぜひ自分の手でシーケンス図を作ってみましょう。
👩🎨 Cacooでシーケンス図を作ってみませんか? 🎨
Cacooを利用中の方はこちらをクリック ・ Cacooを試してみたい方はこちらをクリック