良いシーケンス図を描くための発想法

作成:2008年6月25日

吉田誠一のホームページ   >   ソフトウェア工学   >   技術コラム   >   オブジェクト指向

UMLの図法の中でも、シーケンス図はとても良く使われるものの1つです。クラス構成が複雑なアプリケーションでも、メソッドの呼び出しを順に辿っていき、それをシーケンス図に描いてみると、処理の流れが理解できたりします。

しかし、シーケンス図は、単に処理や手続きの順序を示すためのものではありません。メソッドが多かったり、呼び出す順序が決まっているからと言って、単に、呼び出されるメソッドを順に並べただけのシーケンス図を描いてしまうことがありますが、それはあまり意味がありません。

ここでは、良いシーケンス図を描くための考え方を紹介します。

目次

  1. 処理の流れを図で示そう
  2. 順序だけのシーケンス図は意味がない
  3. 画面とデータの連携を示す
  4. オブジェクトの役割分担と、シーケンス図の存在意義

処理の流れを図で示そう

ここでは例として、画面Aで入力した値を、画面Bで表示するだけの、単純なアプリケーションを考えてみましょう。

アプリケーションの例

このアプリケーションはとても単純ですが、きちんと設計書を書いておくことにしましょう。

ソフトウェアの仕組みは、図で示すと分かりやすくなります。オブジェクト指向で設計したソフトウェアであれば、やはり、UMLを使うのが良いでしょう。

さて、このアプリケーションでは、初めに画面Aで値を入力し、その後、画面Bで値を表示する、という流れがあります。このように、時間の経過とともに進んでいく処理の流れを示すには、UMLの中でも、シーケンス図を描くと良さそうです。

順序だけのシーケンス図は意味がない

ここで、あなたならばどんなシーケンス図を描くでしょうか?

Xさんが描いたシーケンス図は、次のようなものでした。

あまり意味のないシーケンス図

しかし、このシーケンス図は、あまり意味がありません。

確かに、この図は「初めに画面Aを表示し、その後、画面Bを表示する」という動作を表しています。しかし、画面を見せる順序を示したいだけならば、シーケンス図など使う必要はありません。むしろ、次のようなかんたんな図を描いた方が、分かりやすくて良いでしょう。

かんたんな画面遷移図

では、何故Xさんのシーケンス図は、意味のないものになってしまったのでしょうか。それは、シーケンス図を描く目的を誤解してしまったためです。

Xさんは、「画面Aの次に画面Bを表示する」という、画面を見せる順序を第一に考えてしまいました。しかし、むしろここで重要なのは、「画面Aで入力した値が、画面Bに受け渡される」という仕組みです。そのためには、画面Aや画面Bだけでなく、受け渡されるデータ自身も、重要な登場人物となります。

画面とデータの連携を示す

そこで、シーケンス図にデータを表すオブジェクトも登場させてみると、次のような図ができました。

データと画面の連携を示すシーケンス図

2つの画面とデータオブジェクトが、互いに連携している様子が表されています。

さきほどのXさんの図と違って、このシーケンス図は、意味のある図になっています。それどころか、アプリケーションの動作仕様を示すのに、このシーケンス図は欠かすことができません。

オブジェクトの役割分担と、シーケンス図の存在意義

このシーケンス図には、4つのオブジェクトが登場します。しかし、これらのオブジェクトは、それぞれ役割が限定的に定められています。

オブジェクト 知っている範囲 知らない範囲
画面A 入力された値をデータオブジェクトにセットすることまでは知っている。 セットされた値がどう使われるのかは知らない。
画面B データオブジェクトにセットされた値を表示することは知っている。 それを誰がセットしたのかは知らない。
制御部 画面Aの次に画面Bを表示することは知っている。 画面Aが値をセットしたり、画面Bが値を表示していることは知らない。
データ 値がセットされたり、参照されることは知っている。 いつ誰がセットし、いつ誰が参照しているかは知らない。

いずれのオブジェクトも、限られた範囲しか知りません。それぞれのオブジェクトの詳しい説明を見ても、「画面Aで入力した値を、画面Bで表示する」というアプリケーションの仕様は書かれていません。それを示すのが、これらのオブジェクトが連携する様子を示した、さきほどのシーケンス図です。だからこそ、このシーケンス図は、描く意味があるのです。

シーケンス図は、時間の経過とともに進んでいく処理の流れを示すものです。しかし、シーケンス図は、単に処理や手続きの順序を示すために描くものではありません。

シーケンス図の本来の目的は、あるシーンに登場するオブジェクトたちの役割分担を明確にすることです。役割が限定されたオブジェクトが、どのように連携して、1つの大きな動作を実現するのか。それを時間の経過とともに示したものがシーケンス図です。

このように考えることで、重要なソフトウェアの仕組みを読者に伝える、意味のあるシーケンス図を描くことができるでしょう。

Copyright(C) Seiichi Yoshida ( comet@aerith.net ). All rights reserved.