3秒でわかる
クラスの持つデータと操作、そしてクラス同士のつながりを四角と線で表すUMLの図。実装前に責務の分け方を検討するために描きます。
もう少し詳しく
どういうものか
クラス構成図(クラス図)は、UML で定められた図の 1 つで、システムを構成するクラスと、その関係を静的に表します。1 つのクラスを 3 段の四角で描き、上から順にクラス名、属性、操作を並べます。
クラス同士は線でつなぎます。線の形が関係の種類を表し、白抜きの三角矢印は継承、菱形は全体と部分の関係、点線の矢印は依存です。実行の順序や時間の流れは表しません。そこはシーケンス図の役割です。
なぜ必要か
コードを書き始めてから「この処理はどのクラスの仕事か」と迷うと、手戻りが大きくなります。図なら、四角の位置を動かすだけで案を比べられます。
レビューの場でも効きます。1 つのクラスから線が 10 本出ていれば、責務を持ちすぎているとひと目で分かります。文章の設計書では気づけない偏りが、線の本数として現れるのがクラス図の利点です。
具体例
図はテキストでも十分に伝わります。
+---------------------+ +------------------+
| Order | | OrderItem |
+---------------------+ 1 * +------------------+
| - id: Long |<>--------| - productId |
| - createdAt: Date | | - quantity: int |
+---------------------+ | - unitPrice |
| + total(): int | +------------------+
| + addItem(item) | | + subtotal(): int|
+---------------------+ +------------------+
^
| (継承)
+---------------------+
| SubscriptionOrder |
+---------------------+
| - intervalDays: int |
+---------------------+この図をそのままコードに落とすと、次の形になります。
public class Order {
private Long id;
private final List<OrderItem> items = new ArrayList<>();
public int total() {
return items.stream().mapToInt(OrderItem::subtotal).sum();
}
public void addItem(OrderItem item) { items.add(item); }
}
public class SubscriptionOrder extends Order {
private int intervalDays;
}- は private、+ は public を表す記号です。
つまずきやすいところ
1 と * の記載が無いと、1 対 1 なのか 1 対多なのかが読み手に伝わりません似た用語との違い
| 図 | 表すもの |
|---|---|
| クラス図 | クラスの構造と関係(静的) |
| シーケンス図 | 処理の呼び出し順(動的) |
| ER 図 | テーブルと外部キーの関係 |
覚え方
クラス図は「登場人物と、その間柄の一覧表」です。誰が何を持っていて、誰が誰を知っているか。時間の話は出てきません。