呼び出しているメソッドがそのような期待を満たしているとわかっていても、メソッドが呼び出した期待値を満たしていることを検証することで、メソッド呼び出しの戻り値に対して防御する必要があるかどうか疑問に思っています。
与えられた
User getUser(Int id)
{
User temp = new User(id);
temp.setName("John");
return temp;
}
私はすべき
void myMethod()
{
User user = getUser(1234);
System.out.println(user.getName());
}
または
void myMethod()
{
User user = getUser(1234);
// Validating
Preconditions.checkNotNull(user, "User can not be null.");
Preconditions.checkNotNull(user.getName(), "User's name can not be null.");
System.out.println(user.getName());
}
概念レベルでこれを求めています。私が呼び出しているメソッドの内部動作を知っている場合。私が書いたのか、調べたからです。そして、それが返す可能性のある値の論理は私の前提条件を満たします。検証をスキップするのが「より良い」または「より適切な」のか、それとも常に合格する必要がある場合でも、現在実装しているメソッドを続行する前に間違った値から防御する必要がありますか?
すべての答えからの私の結論(気軽にあなた自身のものに来てください):
いつアサートする- このメソッドは過去に誤動作することが示されています
- メソッドは信頼できないソースからのものです
- このメソッドは他の場所から使用され、事後条件を明示的に述べていません
- このメソッドはあなたのメソッドに近いものです(詳細は選択した回答をご覧ください)
- メソッドは、適切なドキュメント、タイプセーフティ、単体テスト、事後条件チェックなどの契約を明示的に定義します
- パフォーマンスが重要です(この場合、デバッグモードのアサートはハイブリッドアプローチとして機能します)
Null
)だけに注目しているのですか?名前が""
(nullではなく空の文字列)またはの場合、おそらく同様に問題があります"N/A"
。結果を信頼するか、適切に妄想する必要があります。