Java開発 虎の巻

UML

UML Webシステムの例

UML

UML=Unified Modeling Language
統一モデリング言語。さまざまな種類があったオブジェクト指向分析・設計を行う上での図表記述方式を統一したもの。 各種の図表の書き方が定められている。

  • 上流工程から下流工程まで一貫した表現が可能
  • 開発手法を選ばない
  • 必要に応じて適切な図を使用する。
  • 国際的な標準

要求図

ユースケース図
システムを使う人とシステムに分け、どのような機能が必要かをまとめる。

構造図

クラス図
クラスの属性や操作、関連、継承を図式化する。

振る舞い図

シーケンス図
オブジェクト間のメッセージのやりとりを時系列に沿って図式化する。
ステートマシン図
オブジェクトの「状態」の移り変わりを図式化する。状態遷移図。
アクティビティ図
処理や手順の流れを図式化する。

実装図

コンポーネント図
ソフトウェアコンポーネントの実装時の構造を図式化する。
配置図
ハードウェア、ソフトウェア、ネットワークなど実装時の配置を図式化する。

PlantUML

テキストで特定書式を書くことでUML図を書くことができるツール。

インストール

まず、描画ソフトであるGraphvizをインストールする。

次にPlantUMLをインストールする。Eclipseの場合、「Asciidoctor editor」プラグインを入れる。
[ヘルプ]-[Eclipseマーケットプレイス]から「asciidoctor」で検索し、「Asciidoctor editor」をインストール(再起動)。

使用方法

Eclipseの場合、[ファイル]-[新規]-[ファイル]から拡張子.pu でファイルを作成。右クリックし[次で開く]-[PlantUML Editor(Asciidoctor)]で開く

@startuml から @enduml の間に書いていく。詳細な記述方法は PlantUML のサイトで。

ユースケース図

外部から見たシステムの機能を表す図。要求・分析モデリングなどの上流工程で使用する。
システムを表す四角形を書き、そのシステムを表すユーザを表すアクター(人の形)を周りに書く。
システム内に楕円でユーザの利用内容(ユースケース)を書き、アクターからこれに線を伸ばす(関連)。

ユースケースはユーザから見た「システムができること」を書く。処理の仕組みには立ち入らない。

PlantUMLでの記述

@startuml
left to right direction
actor プレイヤー
rectangle クイズソフト{
	プレイヤー --> (クイズ解答)
	プレイヤー --> (成績の確認)
}
@enduml

ユースケース記述

ユースケースごとに詳細を書いた文書「ユースケース記述」を作成する。

例:
ユースケース名クイズ解答
概要クイズに解答する
アクタープレイヤー
事前条件クイズソフトが起動し、問題を表示できる状態
基本フロー1.クイズの問題と選択肢の表示
2.選択肢の番号を入力
3.正解かどうか表示し、正解数を記録
4.全問終了まで1に戻る
代替フローAlt2.番号入力時に数字以外を入力したとき
2a.エラー表示し再度入力する
事後条件正解数が記録されていること
シナリオ
  1. 画面に表示「世界で一番高い山は?
    1.富士山
    2.エベレスト
    3.マッターホルン
    4.キリマンジャロ
  2. 2を入力
  3. 「正解!」と表示
  4. 正解数をカウントアップ
  5. 次の問題へ

クラス図

クラスの構造、関連を表す。分析・設計工程で使用する。

クラス:長方形でクラスを表し、内部を線で区切り、クラス名、属性、操作を書く。操作には()を付ける。 属性と操作にはpublicの場合、+を、privateの場合、- を付ける。

PlantUMLでの記述

@startuml
class クイズ{
	-問題
	-選択肢
	-正解
	+表示()
}
@enduml

関連:各クラスに関連があれば実線を引いて表す。線上に関連名を書く。実線の端には数字で多重度を書く(多数の場合 * を書く)。矢印によってどのクラスがどのクラスを参照しているかを示す。 javaでは、インスタンスをフィールドに持つことで表される。

@startuml
class タイマー{
	-解答時間
	+計測開始()
	+計測終了()
}
class クイズソフト{
	-正解数
	+開始()
}
タイマー <-  クイズソフト
@enduml

集約:◇と実線で示す(◆はより強い関係のコンポジション)。javaでは配列やコレクションで表される。

@startuml
クイズソフト "1" *- "*" クイズ
クイズソフト "1" o-- "4" プレイヤー
@enduml

汎化:△と実線で汎化(継承)を表す。△と破線で、実現(インタフェースの実装)を表す。

@startuml
class プレイヤー{
	-名前
	+解答する()
}
class CPUプレイヤー{
	+解答する()
}
class MANプレイヤー{
	+解答する()
}
プレイヤー <|-- CPUプレイヤー
プレイヤー <|-- MANプレイヤー

@enduml

それ以外の関係は破線で表す。これは「依存」と呼ばれ、何らかの形で別のクラスに依存していることを示す。javaでは他のクラスを引数、戻り値、局所変数で使用することを表す。

@startuml
クイズソフト ..> ファイル
@enduml

シーケンス図

オブジェクト間のメッセージのやりとりを時系列に沿って図式化する。分析・設計工程で使用する。

オブジェクト:四角で囲み、下に破線で生存線を書く。生存線上に実行していることを表す四角形(活性区間)を書く。 ここにユーザなどのアクターを書くこともできる。

メッセージ:メッセージは操作の呼び出しであり、実行仕様を矢印の線で結ぶ。呼ばれる方に矢印を書く。また、メッセージからの戻り値がある場合は破線で返す。

@startuml
actor プレイヤー
プレイヤー -> クイズソフト:クイズ開始()
activate クイズソフト
クイズソフト -> ファイル:読み込み()
activate ファイル
ファイル -> クイズ:生成()
activate クイズ
deactivate クイズ
ファイル --> クイズソフト:クイズ数
deactivate クイズソフト
deactivate ファイル
@enduml

グループ化:繰り返し(loop)や条件分岐(alt/else、opt)がある場合、四角で囲んで何によるグループ化かを書く。

@startuml
activate クイズソフト
クイズソフト -> タイマー:計測開始()
activate タイマー
loop
	クイズソフト -> クイズ:表示()
	activate クイズ
	deactivate クイズ
	クイズソフト -> プレイヤー:解答()
	activate プレイヤー
	プレイヤー --> クイズソフト:選択番号
	deactivate プレイヤー
end
クイズソフト -> タイマー:計測終了()
deactivate タイマー
deactivate クイズソフト
@enduml

ステートマシン図

オブジェクトの「状態」の移り変わりを図式化する。状態遷移図。分析・設計工程で使用する。

  • 開始状態:オブジェクト生成時を表し、黒丸で書く。
  • 終了状態:オブジェクト消滅時を表し、黒丸を円で囲んで書く。
  • 遷移:矢印で表す。
@startuml

[*] -r-> 開始待ち
開始待ち --> 問題表示:クイズ開始
問題表示 --> 正解表示
正解表示 --> 問題表示
正解表示 -r-> 正解数表示
正解数表示 -r-> [*]

@enduml

アクティビティ図

処理や手順の流れを図式化する。主に上流工程で要求・分析工程で業務の処理手順などを表す。下流工程ではプログラムの手順などを表す。

  • 開始状態:オブジェクト生成時を表し、黒丸で書く。
  • 終了状態:オブジェクト消滅時を表し、黒丸を円で囲んで書く。
  • 遷移:矢印で表す。
  • 処理の分岐、合流:◇で表す
@startuml
start
while(全問終了?) is (NO)
	:クイズ表示;
	:回答入力;<
	if(正解?)then(YES)
		:正解メッセージ表示;
		:正解数+1;
	else(NO)
		:正解表示;
	endif
endwhile(YES)
stop
@enduml

コンポーネント図

ソフトウェアコンポーネントの実装時の構造を図式化する。実装工程で使用する。コンポーネントの依存関係を表す。

@startuml
rectangle クイズソフト{
	[ファイル操作\njava.io] as file
	[QuizApp]..>file
}
file ..> [テキストファイル]
@enduml

配置図

ハードウェア、ソフトウェア、ネットワークなど実装時の配置を図式化する。実装工程で使用する。

@startuml
rectangle スマートフォン{
	[実行ファイル] as exe
}
rectangle サーバ{
	[問題ファイル] as file
}

exe -->http:use
http - file

@enduml

共通要素

全ての図で共通して使用できる書式。

ステレオタイプ

要素の分類などに使用し、その種類は決められているものもあるが独自に拡張も可能。<<ステレオタイプ名>>で表す。

@startuml
QuizApp ..> BufferedReader:<>
@enduml

ノート

コメント(注釈)を表す。

@startuml
actor 受付
受付 -> (受け付け処理)
note bottom of 受付
	カウンターとネットの両方
end note
@enduml

制約

要素が満たすべき条件。{条件}で表す。

クイズソフト *- クイズ :{クイズIDで整列}

パッケージ

要素をグループ化したものを表現する場合に使用する。

@startuml
package "quiz.main"{
	[QuizApp]
	[Quiz]
	[Player]
}
@enduml