basyura's blog

あしたになったらほんきだす。

WEB+DB PRESS Vol.52

★★★★

携帯の目覚ましが OFF になってて起きたら 8:00 過ぎ。今日は午前休にした。
「Java プログラミングの習慣」でちょと気になったこと。

何かを内部情報として隠蔽するということは、クラスを拡張しようとする側に制約をかけることだと知っておくべきです。

という記述は内部情報を隠蔽しているのが「何か悪いこと」のように読めるし

「迷ったらとりあえず外からは見えない private にしておけばいいか」と安易に考えるのはよくありません。自分なりの基準を持ってアクセス修飾子を決定すべきです。

これは流れ的に

「迷ったらとりあえず外からは見えない private にしておけばいいか」と安易に考えるのはよくありません。とりあえず protected にしておくべきです。

と読めちゃうのが気になった。てか、そういう意図なんだと思う。"「とりあえず private」は危険"って大きな字で書いてあるし。

どう使われるか分からないものを隠蔽するのは当たり前だし、外から見える必要がない(見られると困る)メソッドを private にするのは当たり前じゃないだろうか。将来的に見えた方が嬉しいことが有るかもしれないけど、"迷ってる" 時点で protected や、まして public にするのは危険すぎると思う。ソースを読む側としても protected か private かで、読まないといけない範囲も修正する際に気をつけないといけない範囲も全然違ってくる。
「オーバーライドと内部情報」にあるインスタンス変数を private 指定してることが "悪" のように読み取れるような所もちょっと・・・。サブクラスから読めないのは嬉しくないかもしれないけど、インスタンス変数に直接アクセスされたくないから private にしてアクセス可能なメソッドを提供してるわけで、よく分かってない人が「これのサブクラス作ってちょこっとインスタンス変数を触るメソッド追加したらいいや」とされたら困る。

Ruby なんかは性善説でいいと思うんだけど(そういう思想だし)、Java は性悪説でいいんだと思う。迷ったら private でよく、外に(サブクラスも含めて)見られていいものだけを public や protected にすればいい。

自分の作ったプロダクトを自分の製品や自分の仕事で本格的に使うことを「自分のドッグフードを食べる」と言います

初めて知った。