コンテンツにスキップ

クラス図 (Class diagram)

メンバー変数、メンバーメソッド

uml diagram

上側にメンバー変数を書く。下側にメンバーメソッドを書く。

アクセス修飾子 意味 PlantUML
- private
# protected
~ package-private
+ public
PlantUML
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
@startuml
class ClassName {
  -privateMember: int
  #protectedMember: int
  ~packagePrivateMember: int
  +publicMember: int
  -privateMethod(): void
  #protectedMethod(): void
  ~packagePrivateMethod(): void
  +publicMethod(): void
}
@enduml
TypeScript
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
class ClassName {
  private privateMember: number;
  protected protectedMember: number;
  // packagePrivateMemberの実装例はない
  public publicMember: number;
  private privateMethod(): void {}
  protected protectedMethod(): void {}
  // packagePrivateMethod()の実装例はない
  public publicMethod(): void {}
}

クラス間の 6 つの繋げ方

関連(Association)

クラス A がクラス B のインスタンスをメンバーとして持っている場合は関連を使う。

とりあえず繋がっていることを表現できる。集約コンポジション依存のほうがふさわしい場合はそちらで表現する。

実線を引く。

uml diagram

PlantUML
1
2
3
4
5
6
7
@startuml
class ClassA {
  -classB: ClassB
}
class ClassB {}
ClassA -- ClassB
@enduml
TypeScript
1
2
3
4
class ClassA {
  private classB = new ClassB();
}
class ClassB {}

集約・構成(Aggregation)

集約とはクラス間に全体―部分の関係があるとき、つまり全体にあたるクラスが部分にあたるクラスを包含する関係である。

家には部屋が必ず 1 つ以上存在する。部屋という概念は家なしにはありえず、家がなくなったら部屋もなくなる。部屋に紐づく家は 1 つだけである。

インスタンスを持っている側に がつく。

クラス A とクラス B が全体と部分の関係にあるとき、集約として表現する。

クラス A はクラス B が不可欠、クラス B は独立して使えるときはこれ。

車はエンジンが必ず 1 つ必要である。一方エンジンは車がなくても動く。クラス図ではこれを多重度で表現する。

uml diagram

PlantUML
1
2
3
4
5
6
7
@startuml
class Car {
  -engine: Engine
}
class Engine {}
Car "0..*" o-- "1" Engine
@enduml
TypeScript
1
2
3
4
class Car {
  private engine = new Engine();
}
class Engine {}

uml diagram

PlantUML
1
2
3
4
5
6
7
@startuml
class House {
  -rooms: Room[]
}
class Room {}
House "1" o-- "1..*" Room
@enduml
TypeScript
1
2
3
4
class House {
  private rooms: Room[] = [new Room(), new Room(), new Room()];
}
class Room {}

人間と頭でも例えられる。

uml diagram

PlantUML
1
2
3
4
5
6
7
@startuml
class Human {
  private head: Head
}
class Head {}
Human "1" o-- "1" Head
@enduml

コンポジション

集約の中で特にライフサイクルが同じ場合、コンポジション()で表現する。会社が消滅するとき、部署も消滅する。

uml diagram

集約とコンポジションの例えについて - Qiita

Item 18: 継承よりコンポジションを選ぶ - Qiita

依存・参照(Dependency)

引数などで一時的に参照する、一時的に new して使う、など弱いが使用している場合はこれを使う。

以下はClassAClassBを参照している様子を示している。

点線で参照元から参照先へ矢印を引く。矢尻は>

uml diagram

PlantUML
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
@startuml
class Human {
  +useComputer(computer: Computer): void
}
interface Computer {
  +turnOn(): void
}
class Phone implements Computer {
  +turnOn(): void
}
Human ..> Computer
@enduml
TypeScript
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
class Human {
  useComputer(computer: Computer): void {
    computer.turnOn();
  }
}
interface Computer {
  turnOn(): void;
}
class Phone implements Computer {
  turnOn(): void {
    console.log("Phone has been turned on");
  }
}

継承・汎化(Generalization)

汎化とは一方のクラスがもう一方のクラスをより具体化したクラスである場合のクラス間の関係である。

主に継承関係で使うようである。

実線で子から親へ矢印を引く。矢尻は

uml diagram

PlantUML
1
2
3
4
5
6
@startuml
class Parent {
}
class Child extends Parent {
}
@enduml
TypeScript
1
2
class Parent {}
class Child extends Parent {}

インターフェース・実現・実装(Realization)

点線で具象から抽象へ向くように矢印を引く。矢尻は

uml diagram

PlantUML
1
2
3
4
5
6
@startuml
interface IClass {
}
class Class implements IClass {
}
@enduml
TypeScript
1
2
interface IClass {}
class Class implements IClass {}

抽象クラス/抽象メンバー/静的メンバー

uml diagram

PlantUML
1
2
3
4
5
6
7
8
@startuml
abstract class AbstractClass {
  {abstract} abstractMember: int
  {static} staticMember: int
  {abstract} abstractMethod(): void
  {static} staticMethod(): void
}
@enduml

多重度

集約の例を参照すること。

参考