UMLをアレンジしてハンディに使う

前置き

UMLを本格的に厳密に使おうとすると、設計の本質よりも表記方法に悩んでしまいがちです。また、チームメンバー全員が十分なUMLスキルを身につけておく必要があるので、なかなか大変でしょう。個人的には、柔軟に簡略化して使う方が良いと思っています。

UMLに縁の無い開発チームでも、クラス間の関連や状態遷移、シーケンスなどを図で表現することはあるでしょう。図示することにより、全体を俯瞰できたり、メンバー間の認識共有が促進されることは多いです。そんなときに、全くの亜流で図示するよりは、UMLっぽく描いておいた方がベターでしょう。と、その程度の気持ちでUMLを使ったら良いと思います。

そういう観点の元、UMLの中でも頻繁に使う表記について整理してみました。言語はJavaを前提にしてますが、他の言語でも大差ないと思います。

本文

クラス関連図

クラス

クラス1

  • 左は、超シンプルなクラスの表記
  • 右は、クラス名と共に、主要なフィールド(属性、メンバー変数)とメソッドも表記
  • フィールド名とメソッド名の前に+や-の記号を付けて、可視性(publicとかprivate)を表現することもある
  • title:Stringや、borrow(user:User):booleanのように、フィールドや引数の型を書いても良い
  • ただし、書き過ぎは禁物
public class Book {
  private String title;
  public boolean borrow(User user) {
    ...
  }
}

関連

クラス2-1

  • クラス間に関連がある場合、実線でむすぶ
  • 参照⇔被参照の関係を、参照元から参照先への矢印で表現することが多い
  • 線の両端の数字はインスタンス数を示す(1..*は、1から無限)
  • 1つのBookインスタンスに対して、1つ以上のCopyインスタンスがある
  • Javaでは、例えばメソッドの引数として他クラスのインスタンスを受け取ると、参照⇔被参照の関係が生じる
Copy copy = new Copy(book);

---

public class Copy {
  public Copy(Book book) {
    book.xxxYyy();
  }
}

ちなみに、Bookは抽象的な存在(書物とか著作物のような意味)です。それに対してCopyは物理的な(印刷された)本を表します。

集約とコンポジション

クラス2-2

  • クラス間に全体⇔部分のような関係がある場合、線の一端(「全体」側)に菱形を付ける
  • これを集約(aggregation)と呼ぶ
  • 塗りつぶした菱形は、集約よりも強い結合を表しており、これをコンポジション(composition)と呼ぶ
  • コンポジションは、「全体」側のインスタンスが消滅するときに「部分」側のインスタンスも消滅するような関係である
  • またコンポジションでは、ある「部分」が複数の「全体」に属することはありえない
  • Javaでは、「全体」側のクラスが、「部分」側のインスタンス(への参照)をフィールドとして持つことにより集約やコンポジションを実現する
public class Library {
  private List<Book> bookList;
}

汎化と実現

クラス3

  • 汎化は実線と△で示す
  • 親クラスが抽象クラスの場合は{abstract}を付ける
  • Javaでの汎化手段は継承(extends)
public class User extends Member {
  ...
}

クラス4

  • 実現は点線と△で示す
  • インターフェイスには<<interface>>を付ける
  • Javaでの実現手段は実装(implements)
public class Book implements Borrowable {
  ...
}

テンプレート型

クラス5

  • テンプレートの表記はクラスと似ているが、右肩に点線の矩形でパラメータを描く
  • パラメータに特定の型をバインドすることにより生成されたクラスには<型>を付ける
  • Javaでのテンプレート型は、Generics
public class List<T> {
  ...
}

---

List<Book> list = new List<Book>();

関連クラス

クラス6

  • クラス間の関連自体が属性を持つような場合、その属性を保持するためのクラスを定義することがある
  • そういうクラスは、関連に対して点線でつなげる

適当な例が思い浮かびませんでした。あんまり使わないかな…。

シーケンス図

シーケンス1

  • 左端はアクタ(システム外部の存在)
  • 同期メソッドコールは、実線の矢印で、先端の三角を塗りつぶす
  • メソッドのreturnは、点線
  • 非同期メソッドコールは、実線の矢印で、先端は開く
  • インスタンス生成はreturnと同じく点線

状態遷移図

状態1

  • 黒丸は入口
  • 2重黒丸は出口
  • 状態は角丸矩形
  • 遷移は矢印で描き、遷移のトリガとなるイベントやメソッドを表記

状態2

  • 同じトリガでも、ある条件(サブ状態)によって遷移先が異なる場合、その条件を[]で囲んで付ける

ユースケース

ユースケース1

  • 矩形はシステム
  • 楕円がユースケース
  • 利用者(アクタ)とユースケースを線でむすぶ

ユースケース2

  • 点線矢印は、依存していることを示す
  • <<include>>は、あるユースケースが別のユースケースを再利用することを示す
Last modified:2012/03/07 14:42:07
Keyword(s):
References:[言語Tips]
This page is frozen.