[解決済み] プライベートとプロテクト-ビジビリティ・グッド・プラクティスの懸念点【終了しました
質問
検索してみたら、理論的な違いがわかった。
- 公開 - どのクラス/関数も、このメソッド/プロパティにアクセスすることができます。
- プロテクト - このクラスと任意のサブクラスのみが、このメソッド/プロパティにアクセスできます。
- プライベート - このクラスだけが、このメソッド/プロパティにアクセスできます。継承されることもないでしょう。
それはいいとして、問題は、その
実用的
両者の違いは何でしょうか?どのような場合に
private
を使用し、どのような場合に
protected
? これ以上の標準や許容されるグッドプラクティスはあるのでしょうか?
今までは、継承やポリモーフィズムの概念を保持するために
public
は外部からアクセスされるもの (コンストラクタやメインクラスの機能など) に、そして
protected
を内部メソッド(ロジック、ヘルパーメソッドなど)に使用します。私は正しい道を歩んでいるのでしょうか?
(なお、この質問は私へのものですが、このような質問を見たことがないので今後の参考にもなりますSO)。
どのように解決するのですか?
いいえ、あなたは正しい道を歩んでいません。経験則では、すべてのものを可能な限りプライベートにすることです。これにより、クラスはよりカプセル化され、クラスを使用しているコードに影響を与えることなく、クラスの内部を変更することができます。
クラスを継承できるように設計する場合は、サブクラスからオーバーライドしてアクセスできるものを慎重に選び、それをprotectedにします(Javaでいえば、アクセスはできるがオーバーライドはできないようにしたい場合は、finalにします)。しかし、クラスのサブクラスが存在し、protectedフィールドやメソッドが存在する場合、そのフィールドやメソッドはクラスのパブリックAPIの一部となり、サブクラスを破壊しない限り後で変更することができないことに注意してください。
継承されることを意図していないクラスは、(Javaで)finalにする必要があります。ユニットテストのために、いくつかのアクセスルール(privateからprotected、finalからnon-final)を緩和するかもしれませんが、それを文書化し、メソッドがprotectedであっても、オーバーライドされるべきでないことを明確にしてください。
関連
-
[解決済み] 抽象メソッドと仮想メソッドの違いは何ですか?
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] インターフェースと抽象クラス(一般的なOO)
-
[解決済み] パブリック、プライベート、プロテクトの違いは何ですか?
-
[解決済み] 関数型プログラミングとオブジェクト指向プログラミングの比較【終了しました
-
[解決済み] クラス内の項目の並び順。フィールド、プロパティ、コンストラクター、メソッド
-
[解決済み] Pythonで子クラスから親クラスのメソッドを呼び出すにはどうすればよいですか?
-
[解決済み] JavaScriptのプライベートメソッド
-
[解決済み】サブクラスはプライベートフィールドを継承するのか?
-
[解決済み] 継承と集計の比較【終了しました
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Inversion of Controlとは?
-
[解決済み] メソッドと関数の違いは何ですか?
-
[解決済み] 抽象メソッドと仮想メソッドの違いは何ですか?
-
[解決済み] インターフェースとベースクラス
-
[解決済み] ポリモーフィズムとは何か、何のためにあり、どのように使われるのか?
-
[解決済み】「結合度が低く、結合度が高い」とはどういう意味ですか?
-
[解決済み] ProxyパターンとDecoratorパターンの違い
-
[解決済み] メソッドチェイニング - なぜ良い習慣なのか、そうでないのか?
-
[解決済み] 実装ではなくインターフェースにプログラムする」とはどういう意味ですか?
-
[解決済み] オブジェクト指向分析・設計によるエレベータのモデル化 [終了しました]