カプセル化とデータ隠蔽は直交する概念である

らしい。

Nat said...
To be super pedantic, the rules force you to think about "information hiding" not "encapsulation". The two are orthogonal concerns.
超知ったかぶりするけど、このルールで考えさせられるのは「データ隠蔽」で、「カプセル化」じゃない。直交する概念だよ。
Binstock on Software: Perfecting OO's Small Classes and Short Methods

の一言が引っかかったので。

みんな大好きwikipedia.jpによると

カプセル化(カプセルか、encapsulation)とは、オブジェクト指向を構成する概念の一つ。オブジェクト内部のデータを隠蔽したり(データ隠蔽)、オブジェクトの振る舞いを隠蔽したり、オブジェクトの実際の型を隠蔽したりすることをいう。データ隠蔽と勘違いされやすいが、データ隠蔽はカプセル化の具体例の1つにすぎず、同一のものではない。
カプセル化 - Wikipedia

ということで、データ隠蔽とカプセル化の概念の一つであり、直交する概念とは全く言っていない様子。良くあるカプセル化の説明とも合致する。

ここで、オブジェクト指向の定義に戻ってみると、この中で語られる「カプセル化」は「抽象データ型」と呼ばれる概念だったようだ。

一方、Smalltalkとは別にSimulaの影響を受け作られたC++(1979年)は抽象データ型のスーパーセットとしてのクラス、オブジェクトに注目し、オブジェクト指向カプセル化継承多相性をサポートするものと再定義した。これらは当初抽象データ型、派生、仮想関数と呼ばれ、オブジェクトのメンバ関数を実体ではなくポインタとすることで、継承関係にあるクラスのメンバ関数のオーバーライド(上書き)を可能にしたことで、多相性を実現した(この流儀ではメッセージメタファはオブジェクト指向に必須ではないものと定義し、オブジェクトの持つ手続きをメソッドとは呼ばずメンバ関数と呼ぶ)。
オブジェクト指向プログラミング - Wikipedia

抽象データ型はJavaで言えばインタフェース。wikipedia:抽象データ型によればインタフェースと実装を分離したいのか隠蔽したいのかがとても曖昧に書いてあるが、実装の分離と実装の隠蔽は違う。普通にクラス化することで、結合しつつ隠蔽することは可能だし、利用側が実装クラスを明示的に選択をすることで、隠蔽なしに分離することも可能なので。実装の分離と実装の隠蔽は直交すると見てよい。

実装の隠蔽にデータ隠蔽を含むとすると、抽象データ型とデータ隠蔽とは直交する概念であり、すなわちカプセル化とデータ隠蔽は直交する概念として考えることができる。

そういう感じかな。って、どんだけwikipedia大好きなんだお。

って、2004-04-27によると、両者は明確に「違う」とされているようなので、常識な人にとっては常識だったのかな。あとで追う。