クラスをサブクラス化するときに最初に行うことの1つは、プライベートメソッドの束をprotectedに変更することです。
private
対protected
メソッドに関するいくつかの推論:
private
メソッドはコードの再利用を防ぎます。サブクラスは、プライベートメソッドのコードを使用できないため、再度実装する必要があります-または、もともとプライベートメソッド&cに依存していたメソッドを再実装する必要があります。
一方、他の誰かが彼の答えで示唆したように、サードパーティのサブクラスも「外界」と見なされるという意味で、クラスによって「外界」に提供されるAPIとは見なされない メソッドprivate
既に。
それは悪いことですか?-そうは思いません。
もちろん、(擬似)パブリックAPIは元のプログラマをロックし、それらのインターフェイスのリファクタリングを妨げます。しかし、逆の見方をすると、なぜプログラマーはパブリックAPIと同じくらいクリーンで安定した方法で、独自の「実装の詳細」を設計しないのでしょうか?private
彼は自分の「プライベート」コードを構造化するのにだらしないように使うべきでしょうか?おそらく誰も気付かないので、後でそれをきれいにすることができると思いますか?- 番号。
プログラマーは、「プライベート」コードにも少し考えを入れて、そもそも可能な限り多くのコードの再利用を許可または促進するような方法で構造化する必要があります。そうすれば、非プライベートな部分は、将来不安になるほどの負担にはならないかもしれません。
私が見る多くの(フレームワーク)コードは、一貫性のないprivate
:の使用を採用していますprotected
。プライベートメソッドに委任する以上のことをほとんど行わない非最終メソッドは一般的に見られます。protected
、プライベートフィールドへの直接アクセスによってのみ契約を履行できる非最終メソッド。
これらのメソッドを論理的にオーバーライド/強化することはできませんが、技術的には(コンパイラー)を明白にするものはありません。
拡張性と継承が必要ですか?メソッドを作成しないでくださいprivate
。
クラスの特定の動作を変更したくないですか?メソッドを作成しますfinal
。
特定の明確に定義されたコンテキストの外部でメソッドを呼び出すことは本当にできませんか?メソッドprivate
を作成するか、必要な明確に定義されたコンテキストを別のprotected
ラッパーメソッドで再利用できるようにする方法について考えてください。
だからこそ、private
控えめに使用することをお勧めします。と混同private
しないようにfinal
。-メソッドの実装がクラスの一般的な契約に不可欠であり、したがって置き換えたりオーバーライドしたりしてはならない場合は、それを作成してfinal
ください!
フィールドについてprivate
は、それほど悪くはありません。フィールドが適切なメソッドを介して合理的に「使用」できる限り(そうでない getXX()
かsetXX()
!)。