EurekaMoments

新米エンジニアが一人前を目指す修行の日々を記していくブログです。

PlantUMLを通じてドメインモデル図の書き方を学ぶ

はじめに

ソフトウェアの仕様書、設計書の作成や管理を効率化するために、Markdown + PlantUMLによる作成方法を日々模索しています。
しかしながら、そもそもUML図の正式な書き方というものをちゃんと分かっていないというのが正直なところなので、PlantUMLを通じてUMLの各種図の書き方を勉強していきます。

  • 本稿のテーマは、「UMLによるドメインモデル図の書き方」です。
  • 本稿におけるUML図の作成は、Markdown + PlantUMLがベースであることを前提とします。

プロジェクトの開始時にやるべきこと

  • 設計対象であるシステムが取り扱うものの概念について、チーム内で共通認識を築く
  • それらの概念の繋がりを表現したのがドメインモデル図である。

ドメインモデル図とは

  • ユーザの視点で見た、システムに登場する「もの」の概念(ドメインクラス)を集めた図である。
  • プロジェクトの用語集をクラス図風に表現した図ということにもなる。
  • 自然言語で構成するため、要件定義や仕様の把握に有効である。

ドメインモデル図を描く手順

例として、通販サイトの要件からドメインモデル図を描く場合を考える。

1. 「名詞」の抽出

通販サイトの要件から下記のような名詞が抽出されたとする。

「商品、型番、価格、カテゴリ、カート、注文、レビュー、ウィッシュリスト、ユーザ、登録情報、メールアドレス」

これらの名詞を図に並べてみる。

f:id:sy4310:20181229144517p:plain

名詞は「ドメインクラス、ドメインクラスの属性、アクタ」の3種類に分けられ、判別方法は下記のようになる。

  • アクタ: ユーザや外部システム
  • ドメインクラスの属性: 商品の型番や値段など、○○の△△という形で書けるもの
  • ドメインクラス: 上記以外の名詞

2. モデル同士の関係を線と矢印で表す

線の種類は、「has-one, has-many, is-a-kind-of」の3種類とする。

f:id:sy4310:20181229144644p:plain

さらに、商品に「予約商品、在庫商品」の2種類があるとすれば下記のようになる。

f:id:sy4310:20181229144712p:plain

3. 中心となるモデルに色を付ける

f:id:sy4310:20181229144902p:plain

最終的な上記の図を描くPlantUMLのコードは下記の通り。

left to right direction

hide circle
hide method

package DomainModel {
    class 商品 #F5A9BC
    class 予約商品 #F5A9BC
    class 在庫商品 #F5A9BC
    class カテゴリ
    class レビュー
    class カート
    class 注文 #CEF6F5
    class ウィッシュリスト
    class 登録情報 #A9C6F6
    mix_actor ユーザ

    商品 : 型番
    商品 : 価格
    登録情報 : メールアドレス

    ユーザ -> 登録情報 : has-one
    ユーザ --> カート
    カート o--> 商品 : has-many
    商品 <--o カテゴリ
    ユーザ o--> 注文
    注文 o--> 商品
    ユーザ --> ウィッシュリスト
    ウィッシュリスト o--> 商品
    ユーザ o--> レビュー
    レビュー <--o 商品

    商品 <|-- 予約商品 : is-a-kind-of
    商品 <|-- 在庫商品 : is-a-kind-of
}

ドメインモデル図を用いる際の注意点

  • 後の詳細設計を行う工程でも、意味的なモデルであるところのドメインモデル図の更新を怠らないようにする。
  • 要件とコードの間で仕様の食い違いが起こらないようにする。
  • 別名として「概念モデル図」と呼ばれることもある。

ドメインモデル図の活用方法

  • 最初に図を描いた時点では、必ず図のどこかに「認識があいまいな部分」が出てくる。
  • あいまいな部分を見つけたのは勝利と見なして、仕様の再確認を行う。
  • プロジェクトが進行して仕様変更が出てきたとき、ドメインモデル図は概念の再確認の場として役に立つ。

ドメインモデル図の作成例

例1. 認証システムの場合

f:id:sy4310:20181229145306p:plain

例2. 課金システムの場合

f:id:sy4310:20181229145400p:plain

例3. 本屋の場合

f:id:sy4310:20181229145523p:plain

例4. 投稿システムの場合

f:id:sy4310:20181229145613p:plain

GitHub

今回の記事で記載している各種PlantUML図のコードは下記のGitHubリポジトリで公開しています。

github.com

参考資料