This is version . It is not the current version, and thus it cannot be edited.
[Back to current version]   [Restore this version]

クラスを見つけるのがオブジェクト指向設計#

オブジェクト指向にはクラスが必要です。オブジェクト指向的に設計しようとすることはクラスを見つけることに他なりません。

AクラスとBクラスが異なるクラスとして必要な理由は何?#

クラスを見つけるというのはつまりクラスを定義することですが、では、AクラスとBクラスという2つの異なるクラスが必要になる時の理由は何でしょうか?
  1. 処理が異なる
  2. 責務が異なる
  3. データ構造が異なる
正解は「データ構造が異なる」です。
クラスの根本は、データ構造(構造体)とそれを扱う処理(関数orメソッド)を一体化させたものです。 データ構造というのは属性(プロパティ)の集まりのことで、処理というのはそれらの属性の値を読んだり編集するために存在します。

次の図はSunのJava入門のページに書いてあるものです。What Is an Object?

Fieldsというのがデータ構造のことで、その周りを処理(Methods)が取り巻いています。この図は、クラスを基に生成されたオブジェクトの概念を書いたものですが、オブジェクトの設計図となるクラスの定義も同様な考え方です。
この図からも解るように、データ構造を持たないクラスはそもそもクラスとして機能しません。データ構造と処理の一体化というクラスの原理に反するからです。
ですが、データ構造を持たないクラスをJavaなどの言語では定義出来てしまうため、単なる関数を定義しただけのclassをクラスと勘違いしている設計者/プログラマーが大勢います。 public staticなメソッドのみのクラスがそれです。ユーティリティクラスとも呼ばれます。
※正確に言うと、インスタンス変数にもクラス変数にもアクセスしないメソッドだけのクラスです。

クラスの成り立ち#

手続き型の時代から、オブジェクト指向のクラスがどのようにして生まれたのかを見ていきます。

手続き型の言語においても共通するデータ構造(構造体)をまず最初に決めます。
class_history01.png
次に処理(関数)を作成し、処理と処理がデータ構造を受け渡す形で
ロジックを組み立てます。
class_history02.png
ところが似たような処理があちこちに意図せず作成されてしまいます。
class_history03.png
これを避けるために処理を共通化して共通関数を作成し、共通関数のみを
利用するような開発ルールを設けます。しかし仕組みとしての強制力がないため、
似たような関数が複数生まれる危険性は変わりません。
class_history04.png
この危険性を取り除いたのがオブジェクト指向でのクラスです。データ構造が
共通関数を持つように仕組みとして強要します。
class_history05.png

クラスの中核はデータ構造#

上記で見たように、クラスの最初に必要なのは共通化されたデータ構造です。
共通関数というものを開発したことのある人は解ると思いますが、関数(処理)を共通化するためには受け渡されるパラメータを共通化する必要があります。パラメータが複数ある場合、それらをひとかたまりにまとめるとデータ構造(構造体)になります。
つまり手続き型の言語においても、処理を共通化するためにはまず最初にデータ構造を共通化していたのです。
クラスにおいては、共通化されたデータ構造が処理も持てるようになっています。これがオブジェクト指向の原理です。

まとめ#

  • クラスを規定するのは処理ではなくデータ構造

コラム#

「クラスとはデータ構造のこと」と社内の若手プログラマー達に教えています。
正確に言うと「データ構造と処理を一体化したもの」なんですが、クラスを見分ける際に最初にやることはデータ構造を考えることなので上記のように繰り返し言っています。 にもかかわらず彼らは処理に目が行ってしまい、手続き型の考えにすぐなってしまいます。
これが人間の本能なのかは判りませんが、プログラマーはそれに陥りやすいと思って設計者は設計する必要があるようです。 つまり曖昧な言葉による表現は避け、きちんとしたクラス図を書いて依頼し、プログラマー任せの製造は避けるべきだと考えています。
またプログラマー達がコードのみで考える状態から脱却するため、早いうちからクラス図の読み書きを修得するよう指導することも重要です。

次: 責務はクラスではない

添付ファイルの追加

ログイン済のユーザのみが添付ファイルをアップロード出来ます。

添付ファイル一覧

Kind Attachment Name Size Version Date Modified Author Change note
png
class_history01.png 10.0 kB 1 27-1-2011 00:07 ytp
png
class_history02.png 16.5 kB 1 27-1-2011 00:19 ytp
png
class_history03.png 38.4 kB 1 27-1-2011 00:19 ytp
png
class_history04.png 20.1 kB 1 27-1-2011 00:19 ytp
png
class_history05.png 25.0 kB 1 27-1-2011 00:19 ytp
« This particular version was published on 12-2-2011 02:29 by ytp.