« SQLにおけるnullの扱いについて | トップページ | 動的定数のテクニック »

2007年2月24日 (土)

データとオブジェクト

オブジェクトとデータとは根本的に違う概念であると思っている。
通常、この2つの概念の違いが論じられることはない。
どちらも曖昧な概念であり、そんなことを論じたら大変なことになると思うからだろう。しかし私はこの2つの概念は明確であり、それらの違いを知ることは重要でかつ有用であると思っている。

データとは状態を持たないもの、オブジェクトとは状態を持つものである。
この観点からすると、Javaの基本型オブジェクト、RDBに格納されるデータ、は私のいうデータに相当するものだというのが分かると思う。
そして、Javaのクラスは状態を持っており、オブジェクトに相当する。

RDBはデータの集合を格納しており、SQLはデータの集合を操作する言語である。
RDBにはオブジェクトは格納できないが、その代わりデータの集合でオブジェクトの状態を表現しているのだろう。

オブジェクトとデータの集合は可換だろう。
一つのオブジェクトで様々な状態変化を表現するか、それともデータの集合で状態を網羅するかという違いではないかと思う。
だからOOPとRDBはその戦略が根本的に異なるといえる。
もしある存在の状態が数パターンしかないのならば、一つのオブジェクトの状態変化ではなく、全ての状態パターンを揃えること(=データの集合)でその存在を表現することもできる。状態数が多くなるとこの戦略は破綻する。しかし状態数が少ないのならばこの戦略はシンプルであり複雑さが軽減されるというメリットがある。

ある物をデータとしてみるかオブジェクトとしてみるかはそのプログラムの目的による。突き詰めればどんな物も状態を持っているといえる。しかし、状態を捨象して考えても構わない、あるいはそのほうが効率的だという場合ももちろんある。

たとえば、貨幣・紙幣はその類だろう。
硬貨や紙幣はそれぞれ古かったり汚れていたり新しかったりと状態を持っているが、しかしその価値は同じである。だから普通の人はその状態を気にしない。だから普通の人にとってはお金はデータ的存在なのである。
しかし、硬貨・紙幣のコレクターにとってはそれらの状態は極めて重要なファクターになるだろう。だから彼らにとってはお金はオブジェクトなのである。

現実世界を見てみると、確かにほとんどはオブジェクトであって純粋なデータというのは無いように見える。しかし、抽象的な存在ならばデータといえるものもあるのである。
それは、数やイメージなどの概念である。
数字の1や2などは状態を持たないデータであるといえる。
文字もそうだ。紙に書かれた文字は状態を持つが、文字そのものは抽象的なものであり、データといえるだろう。
そして、それらは実はJavaの基本データ型に相当するのである。
Javaの基本データ型も同じように状態を持っていない。
だから、Javaが全てをオブジェクト型にせず、基本型を残したのはある意味では素直な設計だったのである。それは人間の直感に一致するのである。

オブジェクト指向言語の本質的な変革は、クラス概念の導入によってオブジェクトの概念が表現できるようになったことだと思っていた。しかし、それと同時にそれはオブジェクトとデータの概念の分類を明晰にするという効果もあったのである。

オブジェクト指向言語の世界の概念には意味の混乱が多い。
それは正確に理解しようとすればするほどに混乱するという構造になっている。だから理解力が高い人ほどその混乱の構造を理解してしまうので完全な理解が困難になってしまうと予想される。なぜならばそんな混乱なんてないという前提で学習するし、そんな面はどんな入門書にも書かれていないからである。それにクラスの必要性(=状態の表現手段)を説く入門書もない。

概念群が混乱しているからオブジェクト指向の理解は難しいのである。
それが混乱しており、統一的な理解像というものはない、ということを理解することは難しい。なぜならばそれが理解可能なものとして学習するからである。
だからオブジェクト指向の解説で溢れることになる。
しかし現実が混乱している以上、どんな理解像も失敗することになる。
必要なのは、混乱を正すこと、即ち、概念の整理が最も必要なのである。

|

« SQLにおけるnullの扱いについて | トップページ | 動的定数のテクニック »

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック


この記事へのトラックバック一覧です: データとオブジェクト:

« SQLにおけるnullの扱いについて | トップページ | 動的定数のテクニック »