| |||
第2章 はじめてのUML | ||||||||
この章は入門ということで、通常のモデリング作業でよく用いられる基本的な要素に重点を置いて説明していきます。 UMLの図と、その図に使用される要素を説明するだけでなく、イメージしやすいように、 勤怠管理システムを例にして説明していくことにしましょう。 勤怠システムの仕様今回の例に用いるのは、社員の出退社時間を管理するシステムです。 社員は出退社処理しか行えませんが、総務の人は勤怠変更入力することが可能です。 また、次期開発では、遅刻/早退の場合には、理由を入力する機能を持たせます。 画面のイメージは図1のようになっています。勤怠変更画面のイメージは省略します。
図1: ログイン画面/勤怠入力画面
図の種類 | ||||||||
ユースケース図(use case diagram)システムの使用機能(ユースケース)と、外部環境(アクター)との関連を表します。 図を読み取るのに専門知識は必要なく、 一目でシステムの機能やシステム外部と内部の境界を理解することができます。 そのため、ユーザやクライアントとの意識統一を図ることが容易になるでしょう。 図の要素には、以下のものがあります。
表1: ユースケース間の関係
汎化ではどのように拡張するかが曖昧になるため、
ユースケースにバリエーションを持たせる以外では、
<<include>>や<<extend>>の依存関係を用いることが多くなるでしょう。
|
図2: 勤怠システムユースケース図 |
それでは、勤怠システムを例にユースケース図を見ていきましょう。
図2が勤怠システムのユースケース図です。
「社員認証」を含んだ「勤怠入力」機能があり、遅刻や早退だった場合には、
「早遅理由入力」機能により理由入力することが示されています。
「勤怠入力」機能である「出社」と「退社」は、
「社員」と「社員」の関連を引き継いだ「総務」によって利用されます。
また、「勤怠変更」機能は「総務」だけが利用でき、「勤怠変更」機能にも「社員認証」が含まれています。
「社員認証」/「勤怠入力」/「勤怠変更」機能は、
外部システムである「データベース」(*)を使用します。
ノートにより「早遅理由入力」は、次期開発項目であることが明記してありますので、これ以降は取り上げません。
このように、ユースケース図を作成することで、外部要素であるアクターやシステムに必要とされる機能が、
明確に切り出せていますね。
脚注(*) データベースをアクタとして書くことには異論があるかもしれません.
もしユーザの言葉として「データベース」という単語が表れていれば私はアクターとしてもよいと考えます.
データベースが今回の開発対象外であること,既に存在していること,
他のシステムにおいても共有されることなどを明確にできるからです.
図3: ユースケース記述 ┌──────────┬───────────────────────────┐ │ユースケース名 │出社処理ユースケース │ ├──────────┼───────────────────────────┤ │ゴール │出社処理が完了する │ ├──────────┼───────────────────────────┤ │事前条件 │1-1.ログイン画面になっていること │ ├──────────┼───────────────────────────┤ │メインフロー │2-1.自分の社員IDを入力する │ │ │2-2.パスワードを入力する │ │ │2-3.ログインボタンを押す(E-1) │ │ │2-4.出社ボタンを押して出社時間を登録する(E-2) │ │ │2-5.ログアウトボタンを押す │ │ │2-6.終了ボタンを押す │ ├──────────┼───────────────────────────┤ │事後条件 │3-1.データベースに出社時間が記録されること │ ├──────────┼───────────────────────────┤ │例外フロー │E-1:認証失敗。警告のダイアログボックスを表示する │ │ │E-2:データベースエラー。データベースエラーのダイアログ│ │ │ ボックスを表示した後、システムを終了する │ └──────────┴───────────────────────────┘ 今回は例外処理が発生するので、図3のようなイベントフローという形式で記述してみました。 例外処理が、うまくまとまって表現されていますよね。 この他にも、シナリオと呼ばれる一連の処理の流れを記述する形式があります。 シナリオは一連の処理の流れですので、ひとつのユースケースを表すのに、 メインシナリオや例外シナリオといったような、複数のシナリオが必要となります。 アクティビティ図(activity diagram)業務や処理の流れを表すために、関連する複数の業務手順や処理ステップを順序だてて配置したものです。 ワークフローからユースケースの処理フロー、メソッド内部のアルゴリズムなど、 手順のあるものなら色々なことが表現できます。分岐や同期を表現する場合にも便利でしょう。 図の要素には、以下のものがあります。
図4は勤怠入力システムのアクティビティ図です。 システムが開始すると「ログイン画面表示」に遷移します。 「ログイン画面表示」からの遷移には分岐があり、ログインボタンが押された場合には、 ガードに示すように「認証作業」に遷移し、終了ボタンが押されると終了状態に遷移します。 このケースでは終了状態が2箇所あり、「データベースエラー警告表示」からも終了状態に遷移します。 残りの部分については省略しますので、図から読み取ってみて下さい。
|
図5:勤怠システム開発ワークフロー |
図5はシステム開発のワークフローを示しています。 この開発において、画面デザインは社外のデザイン部門によって、 データベースマシンの設定は社内のデータベース専門部署によって進められます。 開発チームでは、操作画面グループ、勤怠入力グループ、勤怠変更グループに分かれて開発します。 操作画面グループでは、画面部品の作成と単体テストを行いますが、 画面デザインと単体テストが完了するまでは、操作画面を作成することができません。 操作画面の作成と勤怠入力の単体テスト、勤怠変更の単体テストが終了すると、結合テストを行います。 結合テストが終了し、データベースマシンの設定も終わっていれば、総合テストを行い、実稼動へと進みます。 以上の手順が、明確に示されていますね。 状態図(statechart diagram)ひとつのオブジェクトの状態変化を表した図で、外部からの入力と、 それに対するオブジェクトの状態遷移を表します。ひとつのオブジェクトと言っても粒度は様々で、 要求分析ではシステム全体をひとつのオブジェクトと見なすこともあります。 図の要素には、以下のものがあります。
表2: 状態に記述する動作
|
図6: 勤怠入力状態図 |
図6は、認証の視点から見た勤怠入力システム全体の状態図です。 開始時に状態は「未認証」となるので、entryに記述されているようにログイン画面が表示されます。ログインボタンが押された場合、認証が成功すると「認証済」に遷移し、失敗すると自己遷移します。認証が成功した場合には、「認証済」に遷移するので、entryに記述されているように勤怠入力画面が表示されます。出社ボタンが押されることで駆動される出社処理や、退社ボタンが押されることで駆動される退社処理は、状態遷移を伴わないので状態の内部に記述しています。終了ボタンが押されたときと、データベースエラーのときには、システムが終了します。 クラス図(class diagram)モデルの静的な構造を表す図で、問題領域やシステムの構造を表現できます。パッケージ単位での表現や、全体での表現、または機能単位での表現というように、色々な視点で作成することができます。図の要素には、以下のものがあります。
表3: 可視性
|
図7: 勤怠入力クラス図 |
図7は勤怠入力のクラス図です。勤怠入力コントローラークラスは、勤怠入力画面クラスからイベントを受けます。 ここでは、JDK1.2で導入されたイベントモデルを使っています。これはObserverパターンを拡張したものです。 受信用のインターフェースをリスナークラスとして定義することにより、送信者は受信者に直接依存するのではなく、 受信用のインターフェースに依存するようになります。勤怠入力コントローラークラスでは、 勤怠入力ボタンリスナークラスというインターフェースを実現して、勤怠入力画面クラスからイベントを受けとります。 データベースラッパークラスは、データベース操作のラッパー(*)群です。 また、staticメソッドの呼び出しや引数として使用するクラスには、依存関係が用いられていることや、 勤怠入力コントローラークラスが、データという名称で勤務時間データクラスを 「全体-部分」の関係で保持することもわかりますね。ステレオタイプと制約については、以下で説明します。 脚注 (*) 環境に左右されやすい操作や、変更されやすい操作を直接呼び出す代わりに、 その部分を包み込んだ(ラップした)操作を経由して呼び出すことで、変更の影響を、 包み込んだ操作内に局所化することができます。このような目的で作成される操作をラッパーといいます。
図8: インターフェースアイコン
図9: 制約 |
パッケージ図(package diagram)パッケージ間の依存関係を表す、クラス図の一種です。 クラスは、その意味や役割に基づいてグループ化されますが、そのグループをパッケージといいます。 パッケージには、パッケージを含むこともできます。
図10: パッケージ図 図10では勤怠入力のパッケージ構成を示しています。 図7のクラス図に現れたクラスは、次のようにパッケージ分割しています。
表4: パッケージ構成
クラス間の関係がパッケージ間の依存関係になるので、このような依存関係になることがわかりますよね。 |
シーケンス図(sequence diagram)オブジェクトの相互作用を表す相互作用図の1つで、オブジェクト間のメッセージのやりとりを、 時系列に沿って表現します。同じ振る舞いをコラボレーション図で表現できますが、 活性区間とライフラインは表現できません。コラボレーション図については、後に述べます。 図の要素には、以下のものがあります。
脚注(*) UML1.3では非同期に「レ」の字の片矢印が使われましたが,1.4では廃止されました. 図11: シーケンス図 図11は、出社ボタンを押してから出社処理が終了するまでのシーケンス図です。 「:勤怠入力コントローラー(下線)」への出社メッセージが非同期であるため、出社処理とは活性区間が分かれています。 また、「:勤務時間データ(下線)」の生存期間や、set勤務時間メッセージのリターンがtrueであることも、 注目のポイントです。 |
コラボレーション図(collaboration diagram)オブジェクトの相互作用を表す相互作用図の1つで、オブジェクト間のメッセージのやりとりを、 接続関係に着目して表現したものです。レイアウトを工夫することで、 シーケンス図よりもオブジェクト間の関係がつかみやすくなります。図の要素には、以下のものがあります。
図12: コラボレーション図 図12は、先に挙げたシーケンス図と同等の処理を、コラボレーション図で表現しています。 オブジェクト間の関連に注目したかったため、アクターである「社員」は省略しました。 「:勤務時間データ(下線)」の生存期間はわかりにくくなってしまいましたが、 オブジェクト間の関係はシーケンス図よりもつかみやすいですね。 |
オブジェクト図(object diagram)システムに存在するオブジェクトのある時点におけるスナップショットです。 メッセージの無いコラボレーション図とも言えます。図の要素には、以下のものがあります。
図13: オブジェクト図 図13は、出社処理のために勤務時間データのインスタンスを生成し、 データを設定した時点でのオブジェクト群のスナップショットです。 実際にどのようなデータが設定されるかがわかると思います。 |
コンポーネント図(component diagram)コンポーネント間の依存関係を表す図です。図の要素には、以下のものがあります。
図14では、C++での実装を例にとって、ソースコードとヘッダファイルの依存関係を示しています。 勤怠入力コントローラー.cppは、 勤怠入力コントローラー.hとデータベース操作.h、勤務時間データ.hをインクルードします。 図15では実行ファイルとライブラリの依存関係を示しています。 勤怠入力.exeは、データベース.dllをリンクします。 |
配置図(deployment diagram)実行時のシステム構成や、コンポーネントがどのノードに割り当てられているかを表現することができます。 配置図において、コンポーネントはインスタンスとなるので、名称に下線を引いて表現します。 また、通信プロトコルなどを指定したい場合には、ノード間の関連にステレオタイプを付けることで指定できます。 図の要素には、以下のものがあります。
図16では勤怠入力実行時のシステム構成を示しています。 勤怠入力とデータベースが、コンポーネントとして別ノード上に記述されているので、 勤怠入力が動作しているコンピュータとデータベースが動作しているコンピュータが、 異なっていることがわかります。 また、これらのコンピュータ間ではTCP/IPによって通信していることが、ステレオタイプによって記述されています。 |
まとめ勤怠入力システムを例に、一部分を抽出する形で説明してきましたが、 図や要素の意味、実際のシステムへの適用などはイメージできたでしょうか? 最初から全ての図を使うと、すごく時間がかかってしまうと思いますので、 クラス図あたりから使用してみてはいかがでしょう。コーディング前にクラス構成が洗練されるなどの 効果が得られると思います。 次章は実践編ということで、LEGO MINDSTORMS(TM)を制御するプログラミングに、 UMLによる分析/設計を適用します。内容が簡単ですし、 実際にLEGO MINDSTORMS(TM)があれば動かせるものであるため、より楽しめると思います。 是非そちらも読んでみて下さい。 UMLを使った設計の心得 手書きでもよい.まずはホワイトボードに書くことからはじめよ. 「すべて」を書こうとしない.注目しているポイントのみ図にせよ. 用語辞書を作れ.名前を統一せよ. 困ったらノート.日本語で説明せよ. そのプロジェクトでよく現れる分類は,ステレオタイプにせよ.
|