null
「問題が見つからない」場合に a を返すことによって、高価なステートレス チェック コードを実行した結果を効果的にキャッシュするのは「悪い習慣」ですか? 利点は、コードが最小限であり、クラス/コードの肥大化がないことです。
これを次のコードで示します。
public static String getErrorMessage(SomeState x) {
// do some "expensive" processing with "x"
if (someProblem)
return "Some problem";
if (someOtherProblem)
return "Some other problem";
return null; // no error message means "all OK"
}
そして呼び出しコード:
String message = getErrorMessage(something);
if (message != null) {
display(message);
return;
}
// proceed
null
このパターンでは、「エラーがないため、エラー メッセージはありません」という意味に戻ることで、高価なコードを 2 回実行する必要がなくなります。また、余分な「価値の低い」クラス/コードはありません。
明らかな代替手段は、A) チェックとメッセージ作成の懸念を分離することです。
public static boolean isOK(SomeState x) {
// do some "expensive" processing with "x"
return thereIsNoProblem;
}
public static String getErrorMessage(SomeState x) {
// do some "expensive" processing with "x"
if (someProblem)
return "Some problem";
if (someOtherProblem)
return "Some other problem";
}
そして呼び出しコード:
if (!isOK(something)) {
display(getErrorMessage(something)); // expensive code called a second time here
return;
}
// proceed
高価なコードを 1 回実行して問題があるかどうかを判断し、もう一度問題の内容を判断する、または B) 「if」部分に答えるブール型フィールドと答える文字列フィールドを持つ「結果」オブジェクトを返す「メッセージ」部分、例えば
class MyResult { // like a struct in C
boolean ok;
String message;
// accessor methods omitted
}
public static MyResult verify(SomeState x) { ...}
そして呼び出しコード:
MyResult result = verify(something);
if (!result.ok) { // spare me the lecture on accessors - this is illustrative only
display(result.message);
return;
}
これはクラスの肥大化を引き起こし、少し不器用な私見です。
このように戻り値を「オーバーロード」するのは「悪い」ことですか?
それは確かに、私が考えることができるすべての選択肢よりも「きれい」です。