SEさんとの議論がアツいので、こちらの返信が遅くなってしまいました。
> カプセル化という言葉に対して、きっちりとした完全な意味を求めてるのだ
>ろうと思いますが、私はそこまでのことを意識してこの言葉を使っていません。
ええと、用語定義の問題と言うよりは、(私の感覚では)かなり実用的な問題でして。
> 必要なこと意外一切情報を出さないほうがいいのか。内部がある程度想像
>できるほうがいいのか?Cはたとえ使えなくともクラスのデータやメソッドが見
>える。これが良いか悪いかでしょう。私は後者のほうが気分的には良いです。
チームで開発するとき、ライブラリとそれを使うアプリケーションがあったとして、
これらを平行して開発することがあります。そういう場合、ライブラリの
ヘッダファイルだけ先に作ってしまえばアプリケーション側のコンパイルが通せますが、
その時、空実装のメソッドを暫定で書いて後で差し替えるような作業は
バージョン管理が面倒になるので避けたい。また、ヘッダファイルはドキュメント的な
性格も大きいですから、ここに実装やprivateメンバを書いてごちゃごちゃして
しまうのも避けたい。
また、ヘッダファイルの依存関係が漏洩するという問題もあるでしょう。
あるライブラリがウインドウに絵を描いたりするのでprivateメンバで
windows.hで定義されている型などを使っていたりすると、それを使う人にまで
もれなくwindows.hがプレゼントされ名前空間が汚染されてしまったりとか。
……という話題が昔JavaHouseであったとき、
http://java-house.jp/ml/archive/j-h-b/048357.html#body
http://java-house.jp/ml/archive/j-h-b/048360.html#body
これを問題と思わない人が多かったようなので、私のような心配をするのは
少数派なのかもしれませんけれども。
> 言語の設計において、理想的なものを作っていくのもあります。私の場合は
>目的が実現できれば簡単なものでいいと思って設計しています。その代表が
>#defineです。古い仕様で問題点も内包しますが、実に使いやすく融通が利きます。
>今では#defineはあまり良くないとされていますが、私は利点を選びました。
これは同意です。「わかって使う」分には、#defineは便利ですよね。