💭

PlantUMLクラス図

2024/03/26に公開

前回までのあらすじ
https://zenn.dev/nekoxsgames/articles/70c6e991748950

シンプルに描く

https://zenn.dev/ykyki/articles/tips-for-drawing-class-diagram-with-plantuml

@startuml ssample1
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: ユーザ申込
@enduml

property, method, private protected public

記号 修飾子 意味
private 自クラス のみアクセス可能
~ package private 自パッケージのクラス のみアクセス可能
# protected 自クラス と 派生クラス のみアクセス可能
+ public 全クラス アクセス可能
@startuml ssample2
title property, method / private protected public / abstract

namespace PackageSampleA {

  namespace PackageSampleB {
    namespace PackageA {
      class ClassName1 {
        {static} String field1
        Number field2
        Number field3
        --
        {static} void method1()
        Number method2()
        Boolean method3()
      }
    }

    namespace PackageB {

      class ClassName2 {
        - private_field
        ~ package_private_field
        # protected_field
        + public_field
        --
        - private_method()
        ~ package_private_method()
        # protected_method()
        + public_method()
      }
    }
  }
  namespace PackageC {

    abstract class AbstractClassName {
      # field
      --
      - {abstract} method1()
      # method2()
      # method3()
    }

    interface InterfaceName {
      - field
      --
      + method()
    }
  }
}


@enduml

複雑に描いた例

@startuml ssample2
title 複雑でダメなクラス図の見本サンプル

namespace SampleImplements  {
  interface InterfaceName {
      # field
      --
      - {abstract} method1()
      # method2()
      # method3()
  }
  class ClassA {}
  class ClassA2 {}
  note right
    Generalization : 汎化
    クラスA を クラスA2,
    A3がA2を 継承
  end note
  class ClassA3 {}
  class ClassB_Dependency {}
  class ClassC_Aggregation {}
  class ClassD_Composition {}
  
  ClassA <|- ClassA2
  ClassA2 <|-- ClassA3
  InterfaceName <|.. ClassA
  note left
    Realization : 
    クラスA で InterfaceName 実装
    (Implements )
  end note


  ClassA ..> ClassB_Dependency
  note top
    Dependency : 
    ClassA は ClassB に依存している
    クラスB に変更すると クラスA の修正必要
    クラスAがBのプロパティ参照、メソッド呼び出し

  end note

  ClassA o-- ClassC_Aggregation
  note bottom
    Aggregation : 
    Has - a (集約)
    Aggregationとは部分クラスCがなくても
    全体クラスAが存在できる関係
  end note

  ClassA <|--- ClassD_Composition
  note left
    Composition : 
    Contains - a (合成)
    Compositionとは全体クラスAが
    部分クラスDを所有
  end note

}
@enduml

Discussion