UMLクラス図入門:システム構造の可視化
統一モデリング言語(UML)のクラス図は、システムを構成する要素とその関係性を図解する静的なモデルです。ソフトウェア開発において、システムの構造を明確に理解し、設計・開発・保守を効率化するために広く利用されています。クラス図は、クラス、
属性、メソッド、そしてそれらの間の関係を視覚的に表現することで、複雑なシステムを簡潔に表現することを目指します。
クラスの表現
クラス図の中心となるのは「クラス」です。クラスは、システム内のオブジェクトの設計図のようなもので、共通の
属性(データ)とメソッド(動作)を持つオブジェクトの集まりを表します。図上では、クラスは長方形で表現され、その中にはクラス名、
属性、メソッドが記述されます。
クラス名: クラスの名称を記述します。通常は名詞で表現されます。
属性: クラスが持つデータ(変数)です。
属性名、データ型、初期値などを記述します。
メソッド: クラスが実行できる動作(関数)です。メソッド名、引数、戻り値などを記述します。
属性とメソッドには、可視性を示す記号が付けられます。`+`はpublic、`-`はprivate、`#`はprotected、`~`はpackageを示し、アクセス制限を表現します。また、下線を引くことで、クラス変数やクラスメソッドであることを示します。
例として、「車」というクラスを考えてみましょう。
+ 車名: String
+ 色: String
+ エンジン: エンジン
+ 走行する(): void
+ 停止する(): void
この例では、車名と色はpublicな属性、車台番号はprivateな属性です。走行する()と停止する()はpublicなメソッドです。そして、エンジンは別のクラスである「エンジン」クラスとの関連を示しています。
クラス間の関係
クラス図では、クラス間の関係も重要な要素です。主な関係には以下のものがあります。
関連(Association): 2つ以上のクラス間の論理的な繋がりを表します。例えば、「車」と「ドライバー」の関係は関連で表せます。「ドライバー」は「車」を運転し、「車」は「ドライバー」によって運転されます。関連線には、ロール名(関連先の役割)や誘導可能性(一方のクラスから他方のクラスにアクセスできるか)を示す矢印を付けることができます。
集約(Aggregation): 「全体と部分」の関係を表す関連の一種です。「全体」が消滅しても「部分」は存続できる場合に使われます。例として、「車」と「タイヤ」の関係が挙げられます。車はタイヤを構成要素として持ちますが、車が廃棄されてもタイヤは再利用できる可能性があります。図上では、関連線に中抜きの菱形を用いて「全体」側に付けます。
コンポジション(Composition): 「全体と部分」の関係を表す関連の一種で、集約よりも強い結びつきを示します。「全体」が消滅すると「部分」も必ず消滅します。例として、「車」と「エンジン」の関係はコンポジションとしてモデル化できます。車はエンジンがなければ動作せず、車が廃棄されるとエンジンも廃棄されるのが一般的です。図上では、関連線に塗りつぶされた菱形を用いて「全体」側に付けます。
汎化(Generalization): 「is-a」関係を表す継承関係です。「車」と「トラック」の関係は汎化で表せます。「トラック」は「車」の一種です。図上では、スーパークラス(より一般的なクラス)側に中抜きの三角形を用いて表現します。
実現(Realization): インターフェースとそれを実装するクラスの関係を表します。
インターフェースは、クラスが持つべきメソッドの集合を定義し、クラスは
インターフェースを実装することで、そのメソッドを実装します。図上では、
インターフェース側に中抜きの三角形を用い、破線でクラスと繋ぎます。
依存(Dependency): 一方のクラスが他方のクラスに依存していることを表します。依存関係は一時的なもので、関連のように永続的な繋がりではありません。図上では、破線矢印で表現します。
多重度
クラス間の関係において、それぞれのクラスのインスタンスがいくつ関連に参加できるかを表すのが多重度です。例えば、「1人のドライバーは複数の車を運転できる」という場合、ドライバー側の多重度は「0..」(0台以上)、「車」側の多重度は「1」(1人のドライバーのみ)と表現されます。
UMLモデリングツール
UMLクラス図の作成には、様々なモデリングツールが利用できます。これらのツールは、図の作成だけでなく、
ソースコードとの同期、ドキュメント生成などの機能を提供し、開発効率の向上に役立ちます。
クラス図は、システム設計において重要な役割を果たすツールです。本稿で紹介した内容を参考に、クラス図を活用して、より効率的で分かりやすいシステム設計を目指しましょう。