デフォルトアクセスでは、プライベートアクセス修飾子は冗長になりません。
言語デザイナーの立場は、公式チュートリアル- クラスのメンバーへのアクセスの制御に反映されており、わかりやすくなっています(便宜上、引用符内の関連する文は太字になっています)。
アクセスレベルの選択に関するヒント:
他のプログラマーがクラスを使用する場合、誤用によるエラーが発生しないようにする必要があります。アクセスレベルは、これを行うのに役立ちます。
- 特定のメンバーにとって意味のある最も制限の厳しいアクセスレベルを使用します。正当な理由がない限り、プライベートを使用してください。
- 定数以外のパブリックフィールドは避けてください。(チュートリアルの例の多くはパブリックフィールドを使用しています。これは、いくつかのポイントを簡潔に説明するのに役立ちますが、本番コードにはお勧めできません。)
TDDの新機能の回答などで証明されているように、プライベート修飾子を完全に削除する正当化としてのテスト容易性へのアピールは間違っています。今私はプライベートメソッドを避けるべきですか?
もちろん、プライベートメソッドを持つこともできますし、もちろんテストすることもできます。
どちらかがあり、いくつかのあなたがそのようにそれをテストすることができ、または存在しない、その場合には、実行にプライベートメソッドを取得する方法、何を実行するプライベート取得する方法が、その場合には:なぜ一体あなただけ、それをテストしようとしていますいまいましいものを削除...
パッケージレベルのアクセスの目的と使用に関する言語デザイナーの位置は、別の公式チュートリアル「パッケージの作成と使用」で説明されており、プライベート修飾子を削除するという考えとは共通点はありません(便宜上、引用符内の関連する文は太字になっています) :
次のようないくつかの理由で、これらのクラスとインターフェースをパッケージにバンドルする必要があります。
- あなたと他のプログラマは、これらのタイプが関連していることを簡単に判断できます...
- パッケージ内の型が相互に無制限にアクセスできるようにしながら、パッケージ外の型のアクセスを制限することができます ...
<大声で「十分な泣き声を聞いたと思う。声を出してはっきりと言う時間だと思う...」>
プライベートメソッドは、単体テストに役立ちます。
以下の注は、コードカバレッジに精通していることを前提としています。そうでない場合は、時間をかけて学習してください。ユニットテストとテストに興味がある人には非常に役立つからです。
よし、プライベートメソッドとユニットテスト、およびギャップがあることを教えてくれるカバレッジ分析があり、プライベートメソッドはテストでカバーされていない。今...
非公開にすることで何が得られますか
メソッドはプライベートであるため、続行する唯一の方法は、非プライベートAPIを介してコードがどのように使用されるかを調べるためにコードを調べることです。通常、このような調査により、ギャップの理由はテストで特定の使用シナリオが欠落していることが明らかになります。
void nonPrivateMethod(boolean condition) {
if (condition) {
privateMethod();
}
// other code...
}
// unit tests don't invoke nonPrivateMethod(true)
// => privateMethod isn't covered.
完全を期すために、このようなカバレッジギャップの他の(あまり頻繁ではない)理由は、仕様/設計のバグである可能性があります。物事をシンプルにするために、ここでは深く掘り下げません。「メソッドをテスト可能にするためだけに」アクセス制限を弱めると、これらのバグがまったく存在しないことを知る機会を逃してしまうと言えば十分です。
ギャップを修正するために、不足しているシナリオの単体テストを追加し、カバレッジ分析を繰り返して、ギャップがなくなったことを確認します。私は今何を持っていますか?非プライベートAPIの特定の使用法について、新しい単体テストとして入手しました。
新しいテストでは、この使用法の予想される動作が予告なく変更されないことが保証されています。変更された場合、テストは失敗します。
外部の読者は、このテストを調べて、それがどのように使用および動作するのかを学習する場合があります(ここでは、外部の読者がコードを忘れてしまいます。
新しいテストは私がやるものは何でも(私はあなたが賭ける?プライベートメソッドをリファクタリングでください!)リファクタリングに耐性があるprivateMethod
、私はいつもテストしたいと思うでしょうnonPrivateMethod(true)
。privateMethod
メソッドが何であっても、メソッドは直接呼び出されないため、テストを変更する必要はありません。
悪くない?あなたは賭けます。
アクセス制限を弱めることで何を失うのか
ここで、上記の代わりに、アクセス制限を単純に弱めることを想像してください。メソッドを使用するコードの調査をスキップし、myを呼び出すテストに直接進みますexPrivateMethod
。すばらしいです?違います!
上記の非プライベートAPIの特定の使用法についてテストを受けますか?いいえ:nonPrivateMethod(true)
以前のテストはありませんでした。現在、そのようなテストはありません。
外部の読者は、クラスの使用法をよりよく理解する機会を得ますか?いいえ。「-ここでテストしたメソッドの目的は何ですか?-忘れてください、厳密には内部使用のためです。-おっと。」
リファクタリングは許容されますか?方法はありません:私が変更するものは何でもexPrivateMethod
、テストを破るでしょう。名前を変更し、他のメソッドにマージし、引数を変更すると、テストはコンパイルを停止します。頭痛?あなたは賭けます!
要約すると、プライベートメソッドに固執することで、ユニットテストの有用で信頼性の高い機能強化がもたらされます。対照的に、「テスト容易性のために」アクセス制限を弱めると、あいまいで理解しにくいテストコードのみが得られます。これは、小さなリファクタリングによって破損するという永続的なリスクがあります。率直に言って、私が得るものは、技術的な負債のように疑わしく見えます。
</ rant>