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
这种模式通过返回意味着“没有错误消息,因为没有错误”来避免重复执行昂贵的代码两次。并且没有额外的“低价值”类/代码。
显而易见的替代方案是 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
它执行昂贵的代码一次以确定是否存在问题,并再次确定问题所在,或者 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;
}
这会造成班级膨胀并且恕我直言有点笨拙。
以这种方式“重载”返回值是否“不好”?
它肯定比我能想到的所有替代方案都“整洁”。