Marko 的答案显然是该问题中编程努力的最佳答案之一。
但是,将其用作一般示例,从中可以推断出没有更好的解决方案(如 regexp 或 CharMatcher)的上下文,作为风格和实践的问题,我使用并推荐更简单的表达式,捕捉原本会重复的内容使用局部变量的方法调用结果。
我断言这提高了清晰度,因为我们可以命名局部变量,并允许我们将每段更简单的代码定位在最合乎逻辑的位置以执行(同时还允许 JVM 优化它真正擅长的一件事,即局部变量用法)。
您会注意到,在这个转换后的版本中,我们在循环外测试 firstChar,而不是在循环内重复测试;与 .length() 相同。我首先会认为这是逻辑上更正确的编程(它让其他读者感到困惑,为什么这可能会在循环中一遍又一遍地完成),其次才是它会有更好的性能。
虽然循环的这种代码运动不会对这个简单示例的性能产生实质性影响(仅计算 5 次迭代,并且在使用循环库为我们提供更好的解决方案的情况下),但在一般情况下和其他情况下,我建议这样做最佳实践,更易读,更简洁(同时也是面向性能的)。
另请注意,我首先测试长度,因此 .charAt(0) 已知存在,即长度> 0,这意味着我们将reportError()
使用零长度字符串,而不是抛出一些.charAt(0) IndexOutOfBounds
。这是另一个示例,说明使用更简单的表达式如何允许编程逻辑的高级排序。
这种 KIS(保持简单)风格也使调试更容易,因为这些局部变量可以很容易地被观察到。我认为它对维护者来说也更具可读性。
此外,将常量 5 限制在一个位置可以简化维护。
public static final int expectedLength = 5;
...
if ( codeInput.length() != expectedLength )
return reportError ();
char firstChar = codeInput.charAt(0);
if ( firstChar < 'A' || firstChar > 'Z' )
return reportError ();
for (int i = 1; i < expectedLength; i++) {
char nextChar = codeInput.charAt(i);
if ( nextChar < '0' || nextChar > '9' )
return reportError ();
}
...
private static boolean reportError () {
if (verbose)
System.out.println("Sorry, I don't understand!\nUse product codes only.");
return true;
}