続続 カプセル化と情報隠蔽

この話は、初心者向けの説明を書いていて、用語を正確&分かりやすく再理解しようと思って調べてた話なんですが、なんか間違えたかも。はっきりさせたかったのは、「カプセル化と(アクセス修飾子を使った)アクセス制御の違い」だったような気がします。カプセル化を説明する例には、"フィールドprivateにしてセッタ、ゲッタでアクセス"というのが多いけど、それは初心者向けの一例で、カプセル化自体はもっと広い概念の話ですよと。例えば、インターフェイスと実装を分離するというのも、カプセル化の手段の一つでしょう。

アクセス制御(privateにするとか)はカプセル化を実現するための手段の一つ

カプセル化情報隠蔽、データの抽象化は、細かいニュアンスの違いはあるんだろうけど、まとめて「カプセル化の仲間」と考えることにするっす(逃げた)。「まとめて隠す」プログラムの技法です。


と、こんなのを見ていて思った↓


昔のSUNの試験(SJC-P)の本を見ていたら、こんな記述を発見。

カプセル化はデータの抽象化、またはデータの隠蔽とも呼ばれます。

あれ、こうなの?

カプセル化(encapsulation)
≒情報隠蔽(information hiding)
≒データの抽象化(abstract data type?)

こんな記述も発見
http://arton.no-ip.info/diary/20061008.html#p04
via http://d.hatena.ne.jp/Kazzz/20061010/p3

カプセル化した結果は、個々のオブジェクトがそれぞれの役割に応じた処理をするようになること、だ。そのために、必要となる操作とデータをクラス単位にまとめることが、カプセル化別にprivateかどうかは関係ない。ただ、カプセル化されていれば余分なものにさわる必要がなくなるから、さわる必要がないものをさわれなくするのにアクセス指定が使えるというだけのことだ。


追記:こんな記述も発見
http://kmaebashi.com/programmer/object/naze.html

カプセル化とは、「実装詳細の隠蔽」のことです。外部に対しては必要最低限のインターフェースのみを公開し、それ以外は隠蔽することで、実装の変更を可能にしたり、そのモジュールを他でも使いまわすことを可能にする、という概念です。データメンバに機械的にgetXXX(), setXXX()を付けるのがカプセル化ではありません。