カプセル化と情報隠蔽と
ちょうど今悩んでた最中の話題が!
カプセル化と情報隠蔽 - 人類みんなごくつぶし
カプセル化と情報の隠蔽が別物で、カプセル化=クラスそのもの? - 神様なんて信じない僕らのために
続 カプセル化と情報隠蔽 - 人類みんなごくつぶし
カプセル化と情報隠蔽は結構混同されやすく、誤解も多い。そういう自分も、最近よく分からなくなってきた。今まではデザインパターンとともに学ぶオブジェクト指向のこころに書いてあるように、「カプセル化は情報隠蔽を含むが、等しくはない」という風に考えていた。
が、世間では「いや、逆だ」という人もいるし、「その通りだ」という人もいるし、「どっちも一緒だ」という人もいる。「どっちも一緒だ」というのは間違いだとは思うのだが、逆かどうかは言葉遊びに過ぎず、論争のネタにしかならない。
今回の元ネタとなった話題では、「カプセル化は情報隠蔽を含むが、等しくはない」が結論のようだ。しかも、public云々private云々データ云々という話で終わっおらず、より「デザインパターンとともに学ぶオブジェクト指向のこころ」に近い結論に達している。
実装の詳細を隠蔽するのもカプセル化、インターフェイスの後ろに実際のクラスを隠すのもカプセル化、もちろんデータに直接アクセスできないようにするものカプセル化。
ということで、自分の考え*1に近い人がいて安心、みたいな。
あ、それと最近プロパティに対しても懐疑的になってきた。プロパティっていうのはgetter/setterの呼び出しを隠蔽する事が出来るんだけど、そもそもgetter/setterってどうなのよ、ということ。それは設計がヘボイんでないの?と思うわけだ。
確かにgetter/setterが必要なときもある。でも、そんなにプリミティブな操作を許すこと自体、カプセル化を破ってるんじゃないかな、と。データをまとめたクラスを作るとどうしてもアクセッサが必要になるけど、データをまとめたクラスってそんなに言うほど作りますか?
たしかに、今のGUIのモデルではプロパティがあると便利なのは認める。でもそれは、今のモデルだからで、もっといい方法があるかもしれない。その方法ではプロパティはいらないかもしれない。
まぁかもしれない、ってだけで、そんな方法があるかどうかも怪しいし、あったとしても今のモデルよりも直感的に使えるのか、と言われると、「今のモデルでいいんじゃない?」という妥協を結んでしまいそうなわけで・・・
ただ、プロパティの後ろに隠せるのは、やっぱりデータが主体なわけで、それは"真の"オブジェクト指向とは違うよなぁ、とは思う。つか、世間一般で言われてる"オブジェクト指向"自体も自分の考えとはずれているような気がしてならないので、これまたなんとも言えないわけで・・・
もう最近、継承でデータがprivateでgetter/setterがあったらそれでオブジェクト指向でいいや、みたいな感じになっている*2。劣化、誤解が広まるのはいけないことだと思いつつも、自分に自信が持てない上に、昔みたいに反論をするような元気もなく。
あぁ、でもやっぱり言語化するとすっきりするなぁ。もうちょっとがんばってみるか。
閑話休題、良い言語とは何か - 神様なんて信じない僕らのためにを書いた人だったんですね。これにはかなり感銘を受けました。言語を愛するという考えかたをくれて、本当に感謝しています。