PlantUMLでクラス図を作成

クラス図を書くことで、クラス同士の関係が可視化されます。依存の多いクラスはリファクタリングの対象候補です。ここでは、PlantUMLを利用してクラス図を書く方法について整理します。

プロパティとメソッド

@startuml
title プロパティとメソッド

class ClassName {
  {static} String field1
  Number field2
  Number field3
  --
  {static} void method1()
  Number method2()
  Boolean method3()
}
@enduml
565-design-uml-class-1.png

アクセス修飾子
( private protected public )

@startuml
title アクセス修飾子

class ClassName {
  - private_field
  ~ package_private_field
  # protected_field
  + public_field
  --
  - private_method()
  ~ package_private_method()
  # protected_method()
  + public_method()
}
@enduml
565-design-uml-class-2.png
記号 修飾子 意味
- private 自クラス のみアクセス可能
~ package private 自パッケージのクラス のみアクセス可能
# protected 自クラス派生クラス のみアクセス可能
+ public 全クラス アクセス可能

抽象クラス|Abstract

@startuml
title 抽象クラス

abstract class AbstractClassName {
  # field
  --
  - {abstract} method1()
  # method2()
  # method3()
}
@enduml
565-design-uml-class-abstract.png

インタフェース|Interface

@startuml
title インタフェース

interface InterfaceName {
  - field
  --
  + method()
}
@enduml
565-design-uml-class-interface.png

関係

汎化|Generalization
( is-a | 継承 )

クラスAクラスB クラスC クラスD で継承します。

@startuml
title 汎化

class ClassA {
}

class ClassB {
}

class ClassC {
}

class ClassD {
}

ClassA <|- ClassB
ClassA <|-- ClassC
ClassA <|--- ClassD
@enduml
565-design-uml-class-relation-1.png

- の数で配置が変わります。

記号 配置
<|- 横に配置されます。
<|-- 縦に配置されます。
<|--- 縦に配置されます。距離が長くなります。

実現|Realization
( Implements | 実装 )

インターフェースAクラスA で実現します。

@startuml
title 実現

interface InterfaceA {
}

class ClassA {
}

InterfaceA <|.. ClassA
@enduml
565-design-uml-class-relation-2.png

依存|Dependency

クラスAクラスB に依存します。

@startuml
title 依存

class ClassA {
}

class ClassB {
}

ClassA ..> ClassB
@enduml
565-design-uml-class-relation-3.png

依存とは以下のような状態です。

  • クラスAクラスB のプロパティを参照している。
  • クラスAクラスB のメソッドを呼び出している。

よって、クラスB に変更が発生した場合、クラスA の修正も必要になります。

集約|Aggregation
( has-a )

全体クラス部分クラス の関係を表します。

@startuml
title 集約

class 全体クラス {
}

class 部分クラス {
}

全体クラス o-- 部分クラス

note right of 全体クラス
  部分クラスがなくて成り立ちます。
end note
@enduml
565-design-uml-class-relation-4.png

コンポジション|Composition
( has-a | 強い集約)

全体クラス部分クラス の関係を表します。

@startuml
title コンポジション

class 全体クラス {
}

class 部分クラス {
}

全体クラス *-- 部分クラス

note right of 全体クラス
  部分クラスがないと成り立ちません。
end note
@enduml
565-design-uml-class-relation-5.png

パッケージ化|Package

パッケージでクラスのグループ化を行います。

@startuml
title パッケージ化

package PackageA {
  class ClassA {
  }

  class ClassB {
  }
}

package PackageB {
  class ClassC {
  }

  package PackageC {
    class ClassD {
    }

    class ClassE {
    }
  }
}
@enduml
565-design-uml-class-package.png

名前空間|Namespaces

同一のクラス名を作成したい場合、名前空間を分ける必要があります。

@startuml
title 名前空間

namespace PackageA {
  class Abc {
  }

  class Xyz {
  }
}

namespace PackageB {
  class Abc {
  }

  namespace PackageC {
    class Xyz {
    }
  }
}

PackageA.Abc ..> PackageA.Xyz
PackageB.Abc ..> PackageB.PackageC.Xyz
@enduml
565-design-uml-class-namespace.png

参考