クラス図を書くことで、クラス同士の関係が可視化されます。依存の多いクラスはリファクタリングの対象候補です。ここでは、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
 
			 
			 
			 
			 
			 
			 
			