なぜ情報隠蔽と実装隠蔽を区別したいのか

いや,本当は区別したいんじゃなくて「情報隠蔽」という言葉をやめて「実装隠蔽」にしようよって感じなんですが,このタイトルはあまぴょんさんの「なぜカプセル化と情報隠蔽を区別したいのか」のパクリなもので,こうなっちゃいました.心より恥じる.
情報隠蔽という言葉はよく使われます.幸いあまぴょんさんの「POSAでのカプセル化と情報隠蔽」で素敵な定義が引用されているのでそれをまた引用.

ASIN:4764902834 P.389より

情報隠蔽(Information Hiding)
システムの複雑性を適切に扱い、かつ、コンポーネント間の結合度を最小にするために、コンポーネントの実装をクライアントから隠蔽するのが情報隠蔽である。コンポーネントを利用するにあたってクライアントが知る必要がない詳細部分に関しては、コンポーネントが隠蔽するべきである。カプセル化の原理が、情報隠蔽を実現されることが多い。Whole-Partパターン[221]では、この原理を使用して情報隠蔽を実現している。情報隠蔽を、インタフェースと実装の分離の減で実現することもできる。

これ,どうして情報隠蔽っていうんでしょうね? どう見たって,隠しているのは実装じゃないですか.
説明しよう! それは,かつてのプログラミング言語では(そしてJavaでは今でも!),情報隠蔽すなわち実装隠蔽だったからで,単にその名残なのです.たぶん.違うかなぁ?
現在では,情報隠蔽すなわち実装隠蔽というわけではない言語もあります.というか,随分前からあります.その代表としてEiffelをあげることができるでしょう.80年代からある言語です.
Eiffelでは,属性の参照と引数のないメソッド(関数)の呼び出しは,同じ構文になっています.例えば,

person.age

という式があった場合,agePersonの属性かもしれないし,メソッドかもしれないのです.それは,Personの利用者には隠蔽されています.
しかも,これは単に構文上の問題ではなく,Personが当初はageを属性で持っていたのに,後で生年月日から年齢を求めるようなメソッドに変更された場合でも,Personの利用者はリコンパイルの必要もないのです.
これは,属性の参照とメソッドの呼び出しが統合されているからです.これを,「Uniform Access principle」というそうです.
ここから私が思うことは,大切なのは情報隠蔽ではなく,実装隠蔽であるということです.実装さえ隠蔽されていれば,情報は隠蔽されていなくてもいいと思うのです.
しかしながら,少なくともJavaにおいて実装隠蔽をしようと思ったら,情報隠蔽することになります.それは,JavaがUniform Access Principleを守っていないからです.無念だ.


なんて思ったりするわけですが,実のところB.Meyerでさえも実装隠蔽(Implementation Hiding)ではなくて,情報隠蔽(Information Hiding)と呼んでいます.しくしくしく.
なぜなら,情報隠蔽の情報とは,実は属性やデータのことではないからです.ガーン.
「Dictionary of Object Technology The Definitive Desk Reference (isbn:1884842097)*1」より

information hiding n.
the deliberate and enforced hiding of information(e.g., design decisions, implementation details) from clients.
[Booch, Firesmith, Jacobson, Wirfs-Brock]

ぐはぁっ,情報隠蔽という言葉は元々から,「設計や実装の詳細に関する情報」を隠蔽するということだったのですね.ちゃんちゃん.
心より恥じる.

*1:この本にはもう一つ,isbn:0133738876が書いてあります.