🧑‍🎨

PlantUMLでクラス図を描くときのコツ

2024/02/18に公開

設計作業をするときにクラス図を描くことがあるのですが、そのときに個人的に気をつけているコツがあり、ノウハウの共有のためにそのコツをここにまとめます。

背景・前提

  • 仕事の設計作業の一環でクラス図を作成するタイミングが何度もある
  • クラス図を描くことの目的は
    • リーダーや承認者に向けた説明資料ないしエビデンス
    • 開発担当に向けた指示資料
    • 後生に向けた、設計を素早く把握できるようにするための補助資料
  • APIやバッチ単位などで設計をすることが多い
  • レイヤードアーキテクチャに則った設計で考えている
  • 設計中の段階ではクラス図の内容がまだ固まりきらず修正が入ることが度々あるので、手早く手直しできるようにしておきたい

サンプル

PlantUMLで生成した画像
class diagram

コード

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は何を使って書いてる?
  • Mermaidでも同様の図を作成できる?
    • ジェネリクスに相当するものがなかった気がする。色分けを再現するのが難しいかも。色でなくノードの形で代用するという方法は考えられそう
    • ノードの配置や矢印の長さをいい感じに整えるのがMermaidだと難しそう

Discussion