May 13, 2004

情報隠蔽とカプセル化って違うもの?

遅ればせながら、この話題。
僕には正直、未だその違いがよく分からない。
一般に、物事の複雑性をコントロールする、つまり、単純化するということはよく行われていて、そのために手段が、分類とか仕分けと言われるもの。その分類した結果、全体の1集合から複数の部分集合が得られる。その部分集合の中の要素各々の共通的な特徴を引っ張り出して、その部分集合の特徴として位置付けることを抽象という(僕の理解だとこんな感じ)。
さて、オブジェクト指向とは何かと言われると「抽象データ型とメッセージパッシングによる現実世界のシミュレーション」という答えを出すまでもなく、そもそもシミュレーションがきっかけとなり、オブジェクト指向が生まれた。そこでは、實世界の登場人物(人である必要はないけど)をオブジェクトという、ある固体として表現し、メモリ上で現実世界を模した。その際にオブジェクトという「何かしらの生存物」という固体として表現し、その中身を隠蔽した。
つまり、あるドメイン領域に注視する際に、本質を得るために、複雑性を排除するには、余計なものを隠すのがまず行うべき戦略である。これを情報隠蔽という(というのが僕の理解)。
例えば、役所(銀行でもいいけど)の窓口を考えると、住民が役所に行って行うことはある程度想定できる。その想定要件ごとに窓口を設け、必要なデータさえ(紙に書くなりをして)提出すると、望みの書類が入手できる、ということになっている。ここで、住民に、役所の内部のワークフローなり、組織なり、書類発行のための仕組みなりを知らせる必要はなくて、単に書類に必要事項を書いて提出することのみを求める。この、役所内部の仕組み等を隠す、ということが情報隠蔽に他ならない。GoFのデザインパターンで言うところの「ファサードパターン」だ(僕は、ずっと、フェケイドパターンって読むんだと思ってたけど、最近になってようやくファサードってかな書きを見るようになった次第)。
で、話を戻してオブジェクト指向でシステム、特にソフトウェアを考える、というのは結局のところ、複雑性を減らすことが一番の目的であり、この情報隠蔽が当然有益となる。では、オブジェクト指向設計における「隠蔽すべき情報」とは何か、というとこれは、各オブジェクトのもっている属性とか内部のロジックだったりするわけだ。そこで、抽象データ型という概念が出てくる。
一般に、オブジェクト指向の入門書によくある抽象データ型の説明として、属性を隠蔽し、属性へのアクセスを可能とする関数(メソッド)を用意し、その関数を経由しないで、直接触らせることを認めないようにしたもの、というのをよく見かけるが、「抽象データ型」というのは文字通りデータを抽象化した型であり、「なんかよーわからんけど、ここ(あるオブジェクト)にそのデータはある、実際にどういう型で定義してあるかなんてどうでもいいやろ? この関数使えば、関数に指定された型で返すから、それでいいやん」なんじゃないかと(僕は勝手に理解している)。
つまり、この抽象データ型をプログラム上(言語仕様上)実現しているものがすなわち「カプセル化」という機能であり、そのカプセル化を実現するための言語仕様上のメカニズムが「クラス」というものであり、クラスは個々のインスタンスを抽象化して定義したものだ。(と、勝手に理解してまつ)。

というわけで、僕の中では、情報隠蔽とカプセル化というのは、本質は同じもの、だったりするのです。
つまり、プログラミング上、情報隠蔽を実現するための言語仕様上の機能としてカプセル化というものがある、と。
でも、インタフェースだけ見せて実装を隠蔽する抽象クラス(Javaでいうインタフェース)、あるいは前述のファサードパターン、どれも粒度こそ違えど、情報隠蔽の手段であり、やってることはカプセル化を実施することで、ぶっちゃけ「中身を隠している」という意味で同じ、と僕は理解しておるのです。

#間違ってるのかな? あ、ひょっとして、情報隠蔽とカプセル化というのは、クラスとインスタンスの違い? だったら、やっぱり全然違うじゃん。 やりなおーし。見事玉砕。


Posted by money at May 13, 2004 7:03 PM | TrackBack
Similarly Feeds
Comments
Post a comment









Remember personal info?






Powerd by FC2.com
since 2/Feb/2004