1. ホーム
  2. oop

[解決済み] プライベートとプロテクト-ビジビリティ・グッド・プラクティスの懸念点【終了しました

2022-04-27 19:09:49

質問

検索してみたら、理論的な違いがわかった。

  • 公開 - どのクラス/関数も、このメソッド/プロパティにアクセスすることができます。
  • プロテクト - このクラスと任意のサブクラスのみが、このメソッド/プロパティにアクセスできます。
  • プライベート - このクラスだけが、このメソッド/プロパティにアクセスできます。継承されることもないでしょう。

それはいいとして、問題は、その 実用的 両者の違いは何でしょうか?どのような場合に private を使用し、どのような場合に protected ? これ以上の標準や許容されるグッドプラクティスはあるのでしょうか?

今までは、継承やポリモーフィズムの概念を保持するために public は外部からアクセスされるもの (コンストラクタやメインクラスの機能など) に、そして protected を内部メソッド(ロジック、ヘルパーメソッドなど)に使用します。私は正しい道を歩んでいるのでしょうか?

(なお、この質問は私へのものですが、このような質問を見たことがないので今後の参考にもなりますSO)。

どのように解決するのですか?

いいえ、あなたは正しい道を歩んでいません。経験則では、すべてのものを可能な限りプライベートにすることです。これにより、クラスはよりカプセル化され、クラスを使用しているコードに影響を与えることなく、クラスの内部を変更することができます。

クラスを継承できるように設計する場合は、サブクラスからオーバーライドしてアクセスできるものを慎重に選び、それをprotectedにします(Javaでいえば、アクセスはできるがオーバーライドはできないようにしたい場合は、finalにします)。しかし、クラスのサブクラスが存在し、protectedフィールドやメソッドが存在する場合、そのフィールドやメソッドはクラスのパブリックAPIの一部となり、サブクラスを破壊しない限り後で変更することができないことに注意してください。

継承されることを意図していないクラスは、(Javaで)finalにする必要があります。ユニットテストのために、いくつかのアクセスルール(privateからprotected、finalからnon-final)を緩和するかもしれませんが、それを文書化し、メソッドがprotectedであっても、オーバーライドされるべきでないことを明確にしてください。