web-dev-qa-db-ja.com

パブリック、保護、プライベートを使用するためのベストプラクティスは?

何かをコーディングするとき、すべてをデフォルトでprivateにデフォルト設定することは良い習慣だと言ってもいいですか?

そして、サブクラスで必要な場合のみprotectedにアップグレードします。別のクラスで必要な場合はpublicにアップグレードしますか?

12
AJJ

短い答え:はい

より長い答え:

はい、しかしそれは、すべてをプライベートにしてクラスを書くことから始めるという提案として解釈されるべきではありません。このアプローチは、インターフェイスを決定する前に実装の詳細に焦点を当てることにより、クラスの設計を意味します。

クラスを設計するときに考慮すべき最も重要な側面の1つは、クラスの使用方法です。プライベート/実装の詳細について考える前に、パブリックメソッドについて考える必要があります。

さらに、そのアプローチは通常、「このクラスの単体テストをどのように記述すればよいのか」と自問する機会を逃しています。 -これは、実際に単体テストを作成していない場合でも重要な質問です。 (関連: "テスト可能なコードを促進する設計原則とは?"

したがって、パブリックインターフェースを定義したら、残りの部分をプライベートにデフォルト設定することをお勧めします。これは、ほとんどの場合、クラスの外部に関係のない詳細な実装の詳細であるためです。

10
Ben Cottrell

「それから、サブクラスがそれを必要とするならそれをプロテクトに、あるいは他のクラスがそれを必要とするならそれをパブリックにアップグレードするだけですか?」

それは間違ったアプローチです。設計時には、どのパブリックアクセスwantを付与するかを知っておく必要があります。それはあなたのクラスの全体の目的だからです。そして、あなたはwantサブクラスが物事にアクセスするため、保護されたアクセスを与えます。そして、あなたは他人のビジネスではないものにプライベートを使用します。

ここで、誰かがアクセスできないものにneedsアクセスする場合、-needについて真剣に考える必要があります。それらはneedにアクセスすべきではありません。そうでなければ、設計が間違っています。たぶんあなたのデザインisが間違っていて、公開されるべきである何かが公開されていないので、それを変更します。しかし、設計が正しい場合は、needに問題があるため、設計に損傷を与える代わりにthatを修正します。

8
gnasher729

オブジェクト指向プログラミングのこの側面を理解するための鍵は、データのカプセル化の概念です。アイデアは、実装の詳細を非表示にすることで、クラスを理解しやすくすることです。これはdata hidingと呼ばれます。したがって、クラスを使用するために必要な関数を公開(公開)するだけです。これらの関数は、クラスへのinterfaceです。

車のホイールのようなインターフェースを考えてください。ホイールを回して車の方向を決定しますが、カバーの下にはロータリーバルブ、油圧装置、ホイールの回転を変えるプーリーがありますが、車を運転するのに機械技師である必要はありません。

だからあなたの質問への答えはイエスです。クラスに関する詳細をできるだけ他のクラスから隠したいとします。何かがパブリック、プライベート、または保護されるべきであるときを理解することは学ぶのは簡単ですが、習得するのは難しいです。

1
Chris Ghyzel