クラスとは?
オブジェクト指向プログラミング言語では、プログラミングの対象であるものを「オブジェクト」と呼びます。
オブジェクトの定義は非常に抽象的なもので、例えば、"人間"や"自動車"などもオブジェクトと呼べますし、"今頭の中で考えていること"や"昨日食べた夕食"など実体のないものもオブジェクトとして捉える事ができます。
世の中のありとあらゆるものはオブジェクトとして扱われます。
本の中にクラスの定義を端的に述べている一文がありましたので下記にそのまま引用させていただきます。
クラスはオブジェクト指向における基本単位である「オブジェクト」の仕様を表すものです。
オブジェクト指向では、このクラスがどのようなデータ(プロパティ)を持っていて、どういった操作方法(メソッド)があるのかをモデリングしてプログラミングを行います。
概念とクラス
人間は、何かもの(オブジェクト)を認識するときに「XはYだ」という形式を用います。Xの部分が"認識する対象"であり、Yの部分が"概念"です。
例えば、家で"ポチ"という犬を飼っている場合は、「ポチは犬だ」と認識し、ポチという動物が猫でもウサギでもハムスターでもなく、「犬」というカテゴリーに属する動物であることを認識します。
またオブジェクト指向では、この例の"ポチ"のように具体的な対象のことをインスタンスと呼びます。
概念は人間が経験の積み重ねることで構築されます。
わかりやすい説明が本にありましたので、下記に引用させていただきます。
一つひとつの経験を集めて、それから共通性を抽象化する知的操作を帰納といいます。ここで扱われる一つひとつの経験に属するものをインスタンス、そして抽象化されたものごとを概念と呼ぶことにします。
例えば、何度かレストランや食堂で食事をとると、お店で食べ物を頼むときは"お店のメニューの中から食べたいものを選んで店員に伝える"というステップが必要であることを経験します。これは、ファミリーレストランでも学校や会社の食堂でも共通して行う行為です。
このことから、「メニューから食べたいものを選んで店員に伝えること=注文」という概念が生まれます。
クラスの単位は概念毎に区切ることができます。つまり、「1つの概念 = 1つのクラス」と考えることができます。
このクラスの区切り方は大変重要で、"動物"という大きな概念で区切るか"犬"という"動物"という概念が特化された概念で区切るのかは、自分がどういった目的でクラス図を作るのかを念頭に置きながら考えなければいけません。
クラスは概念という人間の認識の単位でもあり、プログラミングの単位でもある」
クラス図の表記法
クラス図は下図のようなクラスシンボルと呼ばれる長方形で表現します。
クラスシンボルは、「クラス名」「データ」「メソッド」の3つの要素で構成されます。
この内「データ」と「メソッド」の部分は省略することができます。
クラス図の種類
クラス図は用途にあわせて3つの種類にわかれます。
概念クラス図
概念クラス図とは、これから作ろうとしているシステムにはどんな概念があり、その概念がどんな構造を持っているかを表す図で、開発の初期に用いられます。
概念図は、システムの関係者(施主・設計者・施工者)の間で概念構造を共有して個人間の概念定義の矛盾を取り除き、コミュニケーションの円滑化を図る役割をします。
個人的には会議の時にホワイトボードに書かれる図のようなもので、"厳密なものではないが理解を少しでも深めることができる図"ではないかと思います。
概念クラス図は"概念図" などとも呼ばれます。
分析クラス図
分析クラス図は、システムの構造を意味論レベルで表した図です。
システムを実装するために必要な概念(オブジェクト)を洗い出し、オブジェクトが情報や振る舞い、オブジェクト間の関係などを表します。
個人的には"かなり具体的にシステムの静的構造が表されている図で、設計クラス図のようにそのまま実装できるほど厳密でない反面、仕様変更などの際に柔軟に対応できる図"なのではないかと考えています。
設計クラス図
設計クラス図は、分析クラス図をより具体的に表現したシステムの作り方を表す図です。
設計モデルで表されていることはそのままの形で実装されます。
設計クラス図は、そのまま実装して実行環境上で動作させられるように作らなければならないため、より厳密性が求められます。
実装に支障をきたすような曖昧な点や矛盾な点がないように作らなければならず、実際のソースコードと設計クラス図の内容に相違があってはいけません。
UMLソフトではクラス図とソースコードを同期する機能を持つものが少なくないようですが、その際のクラス図の種類が設計クラス図なのではないでしょうか。

この記事へのコメント
まだコメントは投稿されていません。