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


12

private何かをコーディングするときに、すべてを事前にデフォルト設定することをお勧めしますか?

そしてprotected、サブクラスがそれを必要とする場合、またはpublic別のクラスがそれを必要とする場合にのみアップグレードしますか?


2
APIを作成する場合は、呼び出し元に必要な機能を予測する必要があります。したがって、アクセス修飾子についてさらに検討する必要があります。あなたが書いているコードを誰が使っているかによります。
user2023861

回答:


10

短い答え:はい

より長い答え:

はい。ただし、すべてを非公開にしてクラスを作成することから始めるという提案として解釈すべきではありません。このアプローチは、インターフェイスに落ち着く前に実装の詳細に焦点を合わせることによるクラス設計を意味します。

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

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

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


したがって、あなたがあなたに言っていることを要約しようとすると(私が理解しているかどうかを見るために)、代わりに最初に公開インターフェースを考えることをお勧めします(つまり、このクラスが実際にどのように使用されているか外から始めますか?)そして、他のすべてをプライベートにしますか?
AJJ

1
@ArukaJ良いアプローチは、実装を構築する前にクラスを使用するコードを書くことです。最初に単体テストの作成を開始するまで、これは少し鶏または卵の問題になることがあります。
ジミージェームズ

1
@ArukaJほぼそうです。JimmyJamesが言及しているように、単体テストを作成しているときは、より直感的に感じられますが、最初は実行がより困難に思えるかもしれません。それは少し異なる考え方を伴うかもしれませんが、目標はあなたのクラスが何を表し、あなたの入力/出力がどのように見えるかについてより慎重に考えることです-全体的にはデザインについてのはるかに「OO」な考え方です。結束性の高いきちんとカプセル化されたクラスになる可能性が高くなります。
ベンコットレル

ユニットテストは実際に使用するものではないため、ユニットテストを使用してクラスを設計するのは嫌です。ただし、クラスがどのように使用されるかを考える上で、何よりも優れていることは間違いありません。
user949300

8

「そして、サブクラスがそれを必要とする場合にのみプロテクトにアップグレードするか、別のクラスがそれを必要とする場合にのみ公開しますか?

それは間違ったアプローチです。設計時に、あなたはどのような公共のアクセスを知っている必要がありたく与えます。通常、それはクラスの目的であるため、パブリックアクセスを許可します。そして、サブクラスにアクセスさせたいので、保護されたアクセスを与えます。そして、あなたは他の誰のビジネスでもないものにプライベートを使用します。

誰かアクセスできないものにアクセスする必要がある場合、その必要性について本当に一生懸命に考える必要があります。彼らはそのアクセスを必要とすべきではない、またはあなたのデザインが間違っています。たぶんあなたのデザイン間違っていて、何かが公開されるはずの何かが公開されていないので、それを変更します。しかし、設計が正しい場合、必要性に何か問題があるので、設計を損傷する代わりにそれを修正ます。


あなたは、あなたがこの時点でサブクラスに予定がないというクラスを持っている(と言ってみましょうかもしれませんする必要はありません)、あなたがあればという方法だったあなたのクラスをサブクラス化するために、便利/サブクラスによって/に必要とされるであろう。その方法を作りますprivateprotected
lfk

受け入れられた答えであるべきで、最初はすべてをプライベートにしてください。私は考えたりデザインしたくないように聞こえます。
ニーニング

1

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

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

あなたの質問に対する答えはイエスです。クラスに関する詳細をできるだけ他のクラスから隠したい場合。何かを公開、非公開、または保護する必要がある場合を理解することは簡単に習得できますが、習得は困難です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.