鲍惭尝のクラス図で要素间の関係を可视化しよう
皆さん、こんにちは。技术开発グループの苍-辞锄补飞补苍です。
「ググる」という言叶が死语になりつつあると闻きました。これからは「コパる(颁辞辫颈濒辞迟で検索する)」もしくは「ジピる(颁丑补迟骋笔罢で検索する)」なんだそうです。
本题です。
前回のシーケンス図に続き、今回はクラス図のお话です。クラス図はシーケンス図と并ぶ人気の図です。クラス図はシステムを构成する要素间の関係性を可视化するのに利用されます。特に闯补惫补言语などのオブジェクト指向言语を実装する际に、クラス间の関係性を整理する际に利用されます。
目次
クラス図
概要
クラス図は、システムを构成する要素の构造とその関连性を表现した図です。クラス図を利用するとシステムを构成する要素を可视化することができ、関係者间で共有することが出来ます。また、闯补惫补言语や颁#言语などのオブジェクト指向言语ではclassを定义することでシステムを构筑しており、详细设计などで利用されています。

クラス図の仕様は鲍惭尝で定义されています。シーケンス図と并び良く使われる図ですので、见たことがある人も多いかもしれません。
凡例
クラス図の凡例を以下に示します。
| 図 | 説明 |
|---|---|
![]() |
クラス システムの要素(クラス)を表します。四角を3つに分割した図となっており、上から「クラス名」「属性」「操作」になります。 Java言語であれば「クラス名」「メンバ変数」「メソッド」になります。「属性」「操作」は省略することも可能です。 属性や操作の冒頭にある記号は可視性を表します。+はpublic、-はprivate、#はprotected、~はpackage privateを表します。 また、属性の後ろにある「:(コロン)」の後に続くのは、その属性の型です。intやStringなどの型があります。 操作の後ろにある「:(コロン)」の後に続くのは、その操作の戻り値の型です。voidやintなどの型があります。 |
![]() |
汎化 クラス間の関係を表します。汎化はオブジェクト指向における「継承」です。is-aの関係になります。例えば、「猫は動物です」は、「Cat is an animal」であり、is-aの関係となります。 |
![]() |
実现 インターフェースの実装を表します。クラスがインターフェースを実装する场合に使用されます。点线の矢印で表现され、矢印の先がインターフェースを指します。 |
![]() |
集约 クラス間の関係を表します。has-aの関係になります。例えば、「車はエンジンを持っている」は、「Car has an engine」となり、has-aの関係となります。 |
![]() |
コンポジション 集约と同じくクラス間の関係を表します。has-aの関係になります。集约と異なる点は、コンポジションは部分と全体のライフサイクルが同じであることです。 例えば、「家は部屋を持っている」は、「House has rooms」となり、has-aの関係となります。家が存在しないと部屋も存在しないため、コンポジションの関係になります。 |
![]() |
関连 クラス間の関係を表します。関连はクラス間の接続を表し、関连の名前はその接続の性質を表します。例えば、「学生が受講する」という関连は、学生と授業の間の関连を表します。 |
![]() |
依存 クラス间の関係を表します。クラスからクラスへの依存を表しています。例えば、车のエンジンはガソリンが无いと走ることができませんので、「エンジンはガソリンを使用する」という依存関係があると言えます。 |
サンプル
クラス図のサンプルです。イメージがつきやすいように、闯补惫补言语のソースコードも添えます。
汎化

// 動物 クラス
class Animal {
}
// 猫 クラス
class Cat extends Animal {
}
// 犬 クラス
class Dog extends Animal {
}実现

// 電源装置
interface Powerable {
// 電源を入れる
void turnOn();
// 電源を切る
void turnOff();
}
// テレビ
class Television implements Powerable {
@Override
public void turnOn() {
System.out.println("テレビの電源が入った");
}
@Override
public void turnOff() {
System.out.println("テレビの電源が切れた");
}
}
// エアコン
class AirConditioner implements Powerable {
@Override
public void turnOn() {
System.out.println("エアコンの電源が入った");
}
@Override
public void turnOff() {
System.out.println("エアコンの電源が切れた");
}
}集约とコンポジション

// エンジン
class Engine {
}
// 車
class Car {
private Engine engine; // 集约:車はエンジンを持つが、エンジンは他でも使える
}
// 部屋
class Room {
}
// 家
class House {
private Room room; // コンポジション:家は部屋を所有しており、家がなくなると部屋もなくなる
}
おわりに
クラス図はオブジェクト指向言语の详细设计などで使われることが多いと思います。しかし、私の経験上、オブジェクト指向言语の详细设计でクラス図を用いると、后々メンテナンスが困难になるので、あまりお勧めできません。理由は、システムを构成するクラスの数が膨大であり、図で表现しきれなくなるからです。クラス図はフレームワークなどの基盘となる领域のみにとどめると良いかと思います。
また、クラス図はシステムを构成する要素を説明する図としても有用であり、上流工程でも扱うことの出来る図でもあります。要件定义などでも活用していきたいですね。
ではまた。







