クラス図を書くことで、クラス同士の関係が可視化されます。依存の多いクラスはリファクタリングの対象候補です。ここでは、PlantUMLを利用してクラス図を書く方法について整理します。
目次
プロパティとメソッド
@startuml
title プロパティとメソッド
class ClassName {
{static} String field1
Number field2
Number field3
--
{static} void method1()
Number method2()
Boolean method3()
}
@enduml
アクセス修飾子
( 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
記号 | 修飾子 | 意味 |
---|---|---|
– | private | 自クラス のみアクセス可能 |
~ | package private | 自パッケージのクラス のみアクセス可能 |
# | protected | 自クラス と 派生クラス のみアクセス可能 |
+ | public | 全クラス アクセス可能 |
抽象クラス|Abstract
@startuml
title 抽象クラス
abstract class AbstractClassName {
# field
--
- {abstract} method1()
# method2()
# method3()
}
@enduml
インタフェース|Interface
@startuml
title インタフェース
interface InterfaceName {
- field
--
+ method()
}
@enduml
関係
汎化|Generalization
( is-a | 継承 )
クラスA
を クラスB
クラスC
クラスD
で継承します。
@startuml
title 汎化
class ClassA {
}
class ClassB {
}
class ClassC {
}
class ClassD {
}
ClassA <|- ClassB
ClassA <|-- ClassC
ClassA <|--- ClassD
@enduml
-
の数で配置が変わります。
記号 | 配置 |
---|---|
<|- | 横に配置されます。 |
<|-- | 縦に配置されます。 |
<|--- | 縦に配置されます。距離が長くなります。 |
実現|Realization
( Implements | 実装 )
インターフェースA
を クラスA
で実現します。
@startuml
title 実現
interface InterfaceA {
}
class ClassA {
}
InterfaceA <|.. ClassA
@enduml
依存|Dependency
クラスA
が クラスB
に依存します。
@startuml
title 依存
class ClassA {
}
class ClassB {
}
ClassA ..> ClassB
@enduml
依存とは以下のような状態です。
クラスA
がクラスB
のプロパティを参照している。クラスA
がクラスB
のメソッドを呼び出している。
よって、クラスB
に変更が発生した場合、クラスA
の修正も必要になります。
集約|Aggregation
( has-a )
全体クラス
と 部分クラス
の関係を表します。
@startuml
title 集約
class 全体クラス {
}
class 部分クラス {
}
全体クラス o-- 部分クラス
note right of 全体クラス
部分クラスがなくて成り立ちます。
end note
@enduml
コンポジション|Composition
( has-a | 強い集約)
全体クラス
と 部分クラス
の関係を表します。
@startuml
title コンポジション
class 全体クラス {
}
class 部分クラス {
}
全体クラス *-- 部分クラス
note right of 全体クラス
部分クラスがないと成り立ちません。
end note
@enduml
パッケージ化|Package
パッケージでクラスのグループ化を行います。
@startuml
title パッケージ化
package PackageA {
class ClassA {
}
class ClassB {
}
}
package PackageB {
class ClassC {
}
package PackageC {
class ClassD {
}
class ClassE {
}
}
}
@enduml
名前空間|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