http://martinfowler.com/bliki/ProtectedData.html

優れたOO設計者はクラス内のデータをprotectedにする?

すべてのデータはprivateにするべきだというOO設計者もいれば、いくつかはpublicにするというOO設計者もいます

(この底の見えないプールに飛び込む前に、 protected アクセス修飾子の意味が言語によって 微妙に変わるということを指摘しておきましょう。 これは重要です。)

このトピックが難しいのは、チーム内開発から見た場合と チーム間開発から見た場合があるからだと思います。 この視点こそが最大の理由です。

サブシステムを作る際に、振る舞いを継承した実装を行うとします。 そのとき、スーパークラスをディープにアクセスできるサブクラスを作れると非常にラクです。 いずれにせよ、すべて自分のコードなのですから。 (多態性を提供するためにサブクラスを使っているのであって、 モジュールを提供しているのではありませんので注意)

一方、フレームワークを構築する際に、オーバーライドしてもらうようなフックとなるクラスを提供するとします。 このときは、サブクラスを壊さないように変更を行うために、データをprotectにするかもしれません。 注意しないとサブクラスはスーパークラスを簡単に壊すことができるから、というのが本当の理由だったりしますけども。 (これについては脆弱な基クラス問題を参照のこと)

このように、データをprotectedにすることは、常に良いとも悪いとも言えません。 まったく知らない人間がオーバーライドするようなクラスの場合は、 protectedな機能をPublishedInterfaceの一部として扱うべきです。 結果として気をつける必要も出てきますが。 フィールドを公開するというのはよくありません。 私ならこういう場合でもそんなことはしません。

これが意図したものではなく、 自分が書いたサブクラスのデータにアクセスしやすくするものだというのであれば、 まあ、理解できないこともありません。 ですが、私は通常、フィールドをprivateにし、滅多にprotectedにはしません。

関連した問題に、自己カプセル化を使うか否かがあります。