UML=Unified Modeling Language
統一モデリング言語。さまざまな種類があったオブジェクト指向分析・設計を行う上での図表記述方式を統一したもの。
各種の図表の書き方が定められている。
テキストで特定書式を書くことでUML図を書くことができるツール。
まず、PlantUMLが利用する描画ライブラリであるGraphvizをインストールする。
コマンドプロンプトから以下を入力しインストールする。
winget install graphviz
次にPlantUMLをインストールする。Eclipseの場合、「Asciidoctor editor」プラグインを入れる。
Eclipseの[ウィンドウ]-[設定]で[Asciidoctor editor]の一番上「Default preview layout」を「水平方向(Horizontal)」にしておく。
Eclipseの場合、[ファイル]-[新規]-[ファイル]から拡張子.pu でファイルを作成。右クリックし[次で開く]-[PlantUML Editor(Asciidoctor)]で開く
@startuml から @enduml の間に書いていく。詳細な記述方法は PlantUML のサイトで。
外部から見たシステムの機能を表す図。要求・分析モデリングなどの上流工程で使用する。
システムを表す四角形を書き、そのシステムを表すユーザを表すアクター(人の形)を周りに書く。
システム内に楕円でユーザの利用内容(ユースケース)を書き、アクターからこれに線を伸ばす(関連)。
ユースケースはユーザから見た「システムができること」を書く。処理の仕組みには立ち入らない。
@startuml left to right direction actor 管理者 rectangle 販売管理{ 管理者 -- (商品の一覧) 管理者 -- (商品の追加) 管理者 -- (商品の変更) 管理者 -- (商品の削除) } @enduml
アクターが2種類の場合
@startuml left to right direction actor 在庫管理者 actor 売上管理者 rectangle 販売管理{ 在庫管理者 -- (商品の一覧) 在庫管理者 -- (商品の追加) 在庫管理者 -- (商品の変更) 在庫管理者 -- (商品の削除) (商品の一覧) -- 売上管理者 (売上の一覧) -- 売上管理者 } @enduml
ユースケースごとに詳細を書いた文書「ユースケース記述」を作成する。
「ユースケース記述」は本来UMLで定義されるものではないため、書くことが厳密には決まっていないが、そのユースケースはどういうことをユーザが行うかをイメージできるように書く(ユーザ向けのマニュアルのようなイメージ)。
ユースケース名 | 商品の削除 ※ユースケース図のユースケースと対応します。 |
概要 | 商品を削除する |
アクター | 管理者 |
事前条件 | 商品が登録されている ※このユースケースを実行できるために事前条件。ログインやデータの登録など。「無し」でもよい。 |
基本フロー | 1.システムは商品一覧と削除リンクを表示する 2.管理者は削除したい商品の削除リンクをクリックする。 3.システムは確認画面に遷移する。削除対象の商品の商品ID、商品名、単価を表示する。 4.管理者は確認画面の削除ボタンを押す。 5.システムは該当商品を削除し、商品一覧に遷移する。 ※システムとユーザがどのように対話していくのかを記述します。「システムは・・」や「ユーザは・・」など主語を明確にします。 |
代替フロー |
3a.削除対象商品が存在しない場合、システムはエラー表示する
※エラー処理など基本フローから分岐するフローがあれば書きます。エラーの条件を明確にしておきます。 |
事後条件 | 商品が削除されていること ※基本フロー終了時に達成して欲しいことを書きます。データの更新や画面への表示など。 |
シナリオ1 |
※フローの具体的な例を書きます。入力や出力は全て具体的な値で書きます。
|
シナリオ2 |
※シナリオは複数書くことが出来ます。
|
システム完成後のテストはユースケース記述を元に行います。事前条件はテストをはじめようとするときに何を準備していないといけないか、事後条件はテストを終えたときに何が達成していないといけないかを定義します。
クラスの構造、関連を表す。分析・設計工程で使用する。
@startuml left to right direction package model { class 商品{ -商品ID -商品名 -単価 } class 書籍{ -著者 -出版社 } class 売上{ -個数 -日付 +金額():金額 } class 商品管理 { +全検索():商品リスト +検索(商品ID):商品 +追加(商品) +変更(商品) +削除(商品ID) } class 売上管理 { +全検索():売上リスト +検索(商品ID):売上リスト } } package control{ class 商品一覧{ +表示() } class 商品別売上{ +表示() } } 商品一覧 ..> 商品管理 商品別売上 ..> 商品管理 商品別売上 ..> 売上管理 売上->商品 商品管理 "1" o-- "0..*" 商品 売上管理 "1" o-- "0..*" 売上 商品 <|-- 書籍 @enduml
長方形でクラスを表し、内部を線で区切り、クラス名、属性、操作を書く。
操作には()を付ける。
属性と操作にはpublicの場合 + を、privateの場合- を付ける。
@startuml class 売上{ -個数 -日付 +金額() } @enduml
操作の括弧内には引数を書く。また、後に : を付け戻り値の型を指定する
@startuml class 商品管理 { +全検索() : 商品リスト +検索(商品ID) : 商品 +追加(商品) +変更(商品) +削除(商品ID) } @enduml
詳細設計時には名前は実際にプログラムで使う名前になる。また、属性の後に : を付け型を指定する
@startuml class Uriage{ -kosu:int -hi:Date +kingaku():int } @enduml
各クラスに関連があれば実線を引いて表す。線上に関連名を書く。矢印によってどのクラスがどのクラスを参照しているかを示す。
売上 -> 商品
Javaでの実装例としては、インスタンスをフィールドに持つことなどである。
// Javaでの実装例 class Uriage{ private int kosu; private Date hi; private Shouhin shouhin; // インスタンスを持つ
関連の一種で全体と部分の関係。◇と実線で示す。実装では配列やリストで表されることが多い。◆はより強い集約関係を表す「コンポジション」。全体が消えたときにそこに含まれる部分も消える関係。
PlantUML
集約: o--
コンポジション: *--
@startuml left to right direction class 商品{ -商品ID -商品名 -単価 } class 商品管理 { +全検索():商品リスト +検索(商品ID):商品 +追加(商品) +変更(商品) +削除(商品ID) } 商品管理 o-- 商品 @enduml
実線の端には数字で多重度を書くことができる。多重度に範囲がある場合には 最小値..最大値 のように書く。不特定多数の場合 * を書く。
商品管理 "1" o-- "0..*" 商品
汎化(継承)は△と実線で表す。
実現(インタフェースの実装)は△と破線で表す。
PlantUML
汎化: <|--
@startuml class 商品{ -商品ID -商品名 -単価 } class 書籍{ -著者 -出版社 } class 期間限定商品{ -開始日 -終了日 } 商品 <|--書籍 商品 <|--期間限定商品 @enduml
それ以外の関係は「依存」と呼ばれ、破線で表す。これは何らかの形で別のクラスに依存していることを示す。依存とはクラスに変化があれば、別のクラスに変化が及ぶこと。実装例では他のクラスを引数や戻り値、ローカル変数等で使用することなどが含まれる。
@startuml class 商品別売上{ +表示() } class 売上管理{ +売上検索(商品ID):売上リスト } 商品別売上 ..> 売上管理 @enduml
パッケージを表す場合、package 名前 { } で囲む。
@startuml package モデル{ class 商品{ - 商品ID - 商品名 - 単価 } class 売上{ - 個数 - 日付 } } 売上 -> 商品 @enduml
オブジェクト間のメッセージのやりとりを時系列に沿って図式化する。分析・設計工程で使用する。
オブジェクト:四角で囲み、下に破線で生存線を書く。ここにユーザなどのアクターを書くこともできる。
メッセージ:オブジェクト間でやりとりされるメッセージ。具体的にはメソッドの呼び出しやオブジェクトの生成、アクターの操作を表す。生存線を矢印の線で結ぶ。呼ばれる方に矢印を書き、どのようなメッセージかを必ず書く。また、メッセージからの戻り値がある場合は破線で返す。
@startuml title 商品一覧 autonumber "#." actor ユーザ ユーザ -> 商品一覧画面:アクセス 商品一覧画面 -> 商品管理:全検索 商品管理 -> 商品:生成 商品管理 --> 商品一覧画面:商品リスト 商品一覧画面 --> ユーザ:表示 @enduml
詳細設計レベルではプログラミングを前提としたオブジェクトに変化する。
@startuml title 商品一覧 /slist GET autonumber "#." actor ユーザ ユーザ -> ShouhinListServlet:GETリクエスト ShouhinListServlet -> ShouhinDAO:生成() ShouhinListServlet -> ShouhinDAO:findAll() ShouhinDAO -> Shouhin:リスト生成 ShouhinDAO --> ShouhinListServlet:shouhinリスト ShouhinListServlet -> Request:shouhinリストセット ShouhinListServlet -> slist.jsp:フォワード slist.jsp --> ユーザ:表示 @enduml
生存線上に実行していることを表す四角形(活性区間)を書ける。生成時にはその場所からオブジェクトを書くことも出来る。
@startuml title 商品一覧 /slist GET autonumber "#." actor ユーザ ユーザ -> ShouhinListServlet++:GETリクエスト ShouhinListServlet -> ShouhinDAO**:生成() ShouhinListServlet -> ShouhinDAO++:findAll() ShouhinDAO -> Shouhin**:リスト生成 ShouhinDAO --> ShouhinListServlet:shouhinリスト ShouhinDAO-- ShouhinListServlet -> Request++:shouhinリストセット Request-- ShouhinListServlet -> slist.jsp:フォワード ShouhinListServlet-- slist.jsp --> ユーザ:表示 @enduml
++ 活性区間の開始
-- 活性区間の終了
** 生成
グループ化:繰り返し(loop)や条件分岐(alt/else、opt)がある場合、四角で囲んで何によるグループ化かを書く。
条件分岐(alt/else)の例
@startuml title 削除確認画面(分析レベル) actor ユーザ ユーザ -> 商品一覧:削除クリック 商品一覧 -> 削除画面:遷移 削除画面 -> 商品DB:検索(sid) 商品DB -> 商品:生成 商品DB --> 削除画面:商品 alt 商品が存在 削除画面 --> ユーザ:確認表示 else 削除画面 --> ユーザ:エラー表示 end @enduml
※繰り返しのとき
loop // 繰り返しのときの処理 end
各オブジェクトのアイコンを変更することが出来る
アクター | actor |
画面 | boundary |
コントローラ | control |
データベース | database |
エンティティ(DTO) | entity |
四角形 | participant |
アイコンを指定した並び順で左から表示される
@startuml title 商品一覧 autonumber "#." actor ユーザ boundary 商品一覧画面 database 商品管理 entity 商品 ユーザ -> 商品一覧画面:アクセス 商品一覧画面 -> 商品管理:全検索 商品管理 -> 商品:生成 商品管理 --> 商品一覧画面:商品リスト 商品一覧画面 --> ユーザ:表示 @enduml
オブジェクトの「状態」の移り変わりを図式化する。状態遷移図。分析・設計工程で使用する。
@startuml title 画面遷移図 [*]->商品一覧 商品一覧-->追加処理 :追加ボタン 商品一覧-->削除確認 :削除リンク 商品一覧-->変更確認 :変更リンク 削除確認-->削除処理 :削除ボタン 変更確認-->変更処理 :変更ボタン @enduml
事前に「state 状態名 色」を書くことで背景色を変えることが出来る。以下は実際には表示されない画面(処理後にリダイレクトする画面)を灰色にしている。
@startuml title 画面遷移図 state 追加処理 #ddd state 削除処理 #ddd state 変更処理 #ddd [*]->商品一覧 商品一覧-->追加処理 :追加ボタン 商品一覧-->削除確認 :削除リンク 商品一覧-->変更確認 :変更リンク 削除確認-->削除処理 :削除ボタン 変更確認-->変更処理 :変更ボタン @enduml
@startuml title ページ遷移図 slist : 商品一覧 insert:POST 追加処理 del:GET 削除確認\nPOST 削除処理 update:GET 変更入力\nPOST 変更処理 suriage:GET 商品別売上 [*]->slist slist-->insert: 追加ボタン slist-->del: 削除リンク\nsid del-->del: POST\n削除ボタン slist-->update: 変更リンク\nsid update-->update: POST\n変更ボタン slist-->suriage: 売上リンク\nsid @enduml
※改行するには\nを書く
処理や手順の流れを図式化する。主に上流工程で要求・分析工程で業務の処理手順などを表す。下流工程ではプログラムの手順などを表す。
@startuml start :変更リンククリック< :変更画面表示; :商品名、単価入力< :変更ボタン押下< if(入力チェック)then(エラー無し) :商品リストにリダイレクト; else(エラー有り) :エラー画面表示; endif stop @enduml
ソフトウェアコンポーネントの実装時の構造を図式化する。実装工程で使用する。コンポーネントの依存関係を表す。
@startuml rectangle model{ [ShouhinDAO]..>[Shouhin] [UriageDAO]..>[Uriage] } @enduml
ハードウェア、ソフトウェア、ネットワークなど実装時の配置を図式化する。実装工程で使用する。
@startuml rectangle クライアント{ [Webブラウザ] as browser } rectangle Webサーバ{ [Tomcat] [サーブレット] as servlet [JSP] } rectangle データベース{ [MySQL] } browser <-> http:use http <-> Tomcat Tomcat -> servlet servlet --> JSP servlet <-> MySQL JSP -> Tomcat @endum
コメント(注釈)を表す。
@startuml title 追加確認画面 /insert GET actor ユーザ ユーザ -> "/slist":追加フォーム入力 note right: 商品名、単価 ユーザ -> "/slist":追加ボタンクリック "/slist" -> InsertServlet:POSTリクエスト InsertServlet -> Shouhin:生成 note left: 商品IDは0 InsertServlet -> ShouhinDAO:insert(shouhin) InsertServlet -> "/slist" : リダイレクト "/slist" --> ユーザ:表示 @enduml
@startuml [*]->商品一覧 商品一覧-->追加確認 :追加ボタン 追加確認-->追加 :追加ボタン note bottom of 追加 :リダイレクトで\n商品一覧へ @enduml
# フォント指定 skinparam DefaultFontName メイリオ title タイトル caption キャプション # 拡大率 scale 1.5
@startuml クラス1 -> クラス2 クラス2 -up-> クラス3 クラス2 -down-> クラス4 クラス2 -right-> クラス5 クラス4 -left-> クラス6 @enduml
red,blue,greenなどHTML/CSSでの色の名前が使用可能
@startuml クラス1 -> クラス2 クラス2 -[#blue]> クラス3 クラス3 -[#ff00ff]-> クラス2 @enduml
シングルクォーテーション以降はコメント
@startuml ' シーケンス図 クラス1 -> クラス2 @enduml
ER図はUMLの一部ではないが、PlantUMLで記述できる。
基本的にクラス図と同じだが class を entityに変え、以下の端子を使用する。
0か1 | |o-- |
1のみ | ||-- |
0以上 | }o-- |
1以上 | }|-- |
また、主キーは -- の上に書く。
@startuml entity 商品{ 商品ID --- 商品名 単価 カテゴリID } entity 売上{ 売上ID --- 商品ID 個数 日付 } entity カテゴリ{ カテゴリID -- カテゴリ名 } 商品 ||--o{ 売上 商品 }o-||カテゴリ @enduml