🧑🎨
PlantUMLでクラス図を描くときのコツ
設計作業をするときにクラス図を描くことがあるのですが、そのときに個人的に気をつけているコツがあり、ノウハウの共有のためにそのコツをここにまとめます。
背景・前提
- 仕事の設計作業の一環でクラス図を作成するタイミングが何度もある
- クラス図を描くことの目的は
- リーダーや承認者に向けた説明資料ないしエビデンス
- 開発担当に向けた指示資料
- 後生に向けた、設計を素早く把握できるようにするための補助資料
- APIやバッチ単位などで設計をすることが多い
- レイヤードアーキテクチャに則った設計で考えている
- 設計中の段階ではクラス図の内容がまだ固まりきらず修正が入ることが度々あるので、手早く手直しできるようにしておきたい
サンプル
PlantUMLで生成した画像
コード
title: ユーザ申込API
skinparam class {
BackgroundColor<<API>> LightSkyBlue
BackgroundColor<<Batch>> LightGreen
BackgroundColor<<Service>> LightSalmon
BackgroundColor<<Repository>> Plum
}
interface EngagementRepository as "契約Repository\nEngagementRepository" <<Repository>>
interface UserRepository as "ユーザRepository\nUserRepository" <<Repository>>
class UserReferService as "ユーザ参照Service\nUserReferService" <<Service>>
UserReferService ----> UserRepository: 検索
UserReferService ----> EngagementRepository: 検索
class UserOrderCheckService as "ユーザ申込判定Service\nUserOrderCheckService" <<Service>>
class UserOrderService as "ユーザ申込Service\nUserOrderService" <<Service>>
UserOrderService --> UserRepository: 新規作成\n更新
UserOrderService --> UserReferService: ユーザ情報取得
UserOrderService --> UserOrderCheckService: 新規申込可否判定\n継続申込可否判定
UserOrderService --> EngagementRepository: 新規契約\n解約
class UserOrderApi as "ユーザ申込API\nUserOrderApi" <<API>>
UserOrderApi ----> UserOrderService: ユーザ申込
コツ
- 原則として、詳しく描きすぎないこと
- クラス図の目的としては今回はあくまでドキュメント用
- 実装に任せる部分は任せる。例えば上記ではメソッド名の指示は避けている
- ただ一方で、実装クラス名を指示したいときには、上記の図のように併記をしておくとよい
- 依存関係を全て厳密に書き下すと図が大きく複雑になってしまうことがある。改修などがある主要なものだけ抜き出す
- コード上の工夫
- コードでは図とは逆に下層から上層に向けた順番で書いていく。直感的ではないが、PlantUMLの仕様上こうするしかなさそう
- ジェネリクスと
skinparam
を活用しつつ、レイヤーを色分けする - 同一レイヤーでは
-->
で、レイヤーを跨ぐ場合には---->
で繋ぐと、レイヤーの間隔がほどよくなる - クラス名をそのままノード名に使うと楽
- ひとつのAPIもしくはバッチに対して今回のようなクラス図をひとつ、という単位で描いている
- ひとつの図に複数入れようとすると複雑さが上がってしまう
補足情報
- PlantUMLは何を使って書いてる?
- vscodeかObsidian。どちらもPlantUMLのPluginを追加して使っている
- ただし、外部サーバにデータを送信することを避けるために、ローカルサーバを立てて使うようにしている
- 具体的にはPlantUML PicoWeb Serverを使っている: plantuml.com/de/picoweb
- docker でもできるらしい: plantuml/plantuml-server - Docker Image | Docker Hub
- Mermaidでも同様の図を作成できる?
- ジェネリクスに相当するものがなかった気がする。色分けを再現するのが難しいかも。色でなくノードの形で代用するという方法は考えられそう
- ノードの配置や矢印の長さをいい感じに整えるのがMermaidだと難しそう
Discussion