アシアルブログ

アシアルの中の人が技術と想いのたけをつづるブログです

UMLを描こう - Vol.1 クラス図

こんにちは,浦本です。
今回はUML(Unified Modeling Language)について取り上げたいと思います。

UMLとは?
UMLとは,システムの設計を様々な切り口でモデル化し図示するためのグラフィカル言語です。
オブジェクト指向設計では,設計概念を表す何らかの設計図が必ず必要になります。
なぜならば,コードだけでは,コンポーネントの構成や,オブジェクトの相互作用を
分かりやすく表現できないからです。
特に,ある程度規模の大きなシステム開発においては,設計図が無い場合,
拡張性やメンテナンス性に乏しいクラスの山が作られがちです。
設計図が無いと,システムが要求を満たしていることを保証するユニットテストも行えません。
そこで,オブジェクト指向設計を,標準化された図として表現できるUMLが役に立つわけです。

最低限必要なのはクラス図とシーケンス図
UMLには10種類以上もの図があるのですが,もちろん全て覚える必要はありません。
システムの詳細設計ドキュメントを読み書きする際に最低限知っておくべき図は,クラス図とシーケンス図の2種類です。
クラス図はクラスの静的な設計を表し,シーケンス図はオブジェクトの動的な設計を表します。

今回は,クラス図について説明します。

3秒で分かるクラス図
クラス図とは,クラスの構成やクラス間の関係を記述するための図です。

クラスを表現するには,長方形を描いて,上から「クラス名」「属性」「メソッド」を記述します。

属性とメソッドの前には,以下のアクセス修飾子を指定できます:
+ public
- private
# protected

属性の型や,メソッドのパラメタの型,メソッドの戻り値の型は,
コロン区切りで後ろに記述します。

abstractクラスや,abstractメソッドは斜体で表します。


static属性や,staticメソッドには下線を付けます。


インターフェイスもクラスと同様に描けます。
インターフェイス名の上には≪interface≫を付けます。

インターフェイスのメソッドはabstractメソッドと決まっているので,
斜体にする必要はありません。
ちなみに≪~≫はステレオタイプといって,
図の要素に補足的な情報を付加するときに記述します。

クラス図では,クラス同士を線でつなぐことで,
以下のように様々な「リレーションシップ」を示すことができます。

generalization(汎化)は,継承関係を表します。
下図ですと,class AjaxResponse extends Responseという意味です。


realization(実現)は,簡単にいえばimplementsに対応します。
下図ですと,class JapaneseMailer implements IMailerという意味です。


association(関連)は,要するに「has」です。
下図ですと,Userの属性として,Accountを持っているという意味になります。


aggregation(集約)は,associationの特別なケースで,
単なるhasではなく,構成員として持っているという意味になります。
下図ですと,「WishlistはProductを構成員としてたくさん持っている」という意味になります。

ポイント:
・Wishlistが削除されても,Productは削除されません。
・1つのProductが複数のWishlistに所属することができます。

composition(合成集約)は,aggregationの特別なケースで,より結びつきが強くなります。
下図ですと,「Orderは一心同体の関係でOrderItemをたくさん持っている」という意味になります。

ポイント:
・Orderが削除されると,OrderItemも削除されます。
・1つのOrderItemが複数のOrderに所属することはありません。

dependency(依存)は,その他の雑多な依存関係を表します。
下図ですと,「PurchaseControllerは,属性としてCartを持っているわけではないが,一時的にCartを参照している」という意味になります。


リレーションシップの選択でややこしいのは
aggregationかcompositionかの判断なのですが,
迷うぐらいならaggregationにしておけば大丈夫です。

その他の仕様
以上で,クラス図の基本を説明しました。
その他のクラス図の細かな仕様はググってみてください。

UMLを描画できるソフト
無料で使える描画ソフトとしては,Change Visionastah* communityがあります。
また,本格的な業務向け製品としては,Sparx SystemsのEnterprise Architectがあります。

まとめ
今回はUMLの主要な図の一つであるクラス図を取り上げました。
活用例を見たい場合は"class diagram"とかで画像検索してください。

皆さんもぜひ,UMLをバリバリ描いて,特定の言語に依存しないオブジェクト指向設計を実践してみてください。
コードとにらめっこするよりも,はるかに設計ノウハウが身につくはずです。

次回の予定
シーケンス図について説明する予定です。

参考文献
UML spec. http://www.omg.org/spec/UML/2.3