我试图找出哪些实践使您的代码更具可读性,特别是当您的代码块很短时。请查看for循环的这两个版本,让我知道哪一个更易读;
private boolean isValid(String guessInput)
{
boolean result = true;
for (int i = 0; i < guessInput.length(); i++)
{
if (!Character.isDigit(guessInput.charAt(i)))
{
result = false;
break;
}
}if (result)
{
int guessInputInt = Integer.parseInt(guessInput);
if (guessInputInt >= minGuess && guessInputInt < maxGuess)
guesses.add(guessInput);
else
result = false;
}else
System.out.println("Your input is not valid.");
return result;
}
第2版
private boolean isValid(String guessInput)
{
boolean result = true;
for (int i = 0; i < guessInput.length() && result; i++)
{
if (!Character.isDigit(guessInput.charAt(i)))
{
result = false;
}
}if (result)
{
int guessInputInt = Integer.parseInt(guessInput);
if (guessInputInt >= minGuess && guessInputInt < maxGuess)
guesses.add(guessInput);
else
result = false;
}else
System.out.println("Your input is not valid.");
return result;
}
答案 0 :(得分:0)
break
循环方法在两者中更好。此外,您可以在循环中移动Sysout
语句,例如:
private boolean isValid(String guessInput){
for (int i = 0; i < guessInput.length() && result; i++){
if (!Character.isDigit(guessInput.charAt(i))){
return false;
}
}
return true;
<强>更新强>
这是另一种方法(使用java 8流):
public static boolean isValid(String s){
return !s.chars()
.filter(c -> !Character.isDigit((char)c))
.findFirst()
.isPresent();
}
同意Mark Jeronimus的观点。您应该在调用方法时调用此方法和print
消息,而不是在valildating方法中使用Sysout
。
答案 1 :(得分:0)
第三种选择如何:
private boolean isValid(String guessInput) {
boolean result = isNumeric(guessInput);
if (result)
// ...
}
private boolean isNumeric(String input) {
for (int i = 0; i < guessInput.length(); i++)
if (!Character.isDigit(guessInput.charAt(i)))
return false;
return !input.isEmpty();
}
甚至更简单:
private boolean isValid(String guessInput) {
try {
int guessInputInt = Integer.parseInt(guessInput);
if (guessInputInt >= minGuess && guessInputInt < maxGuess) {
guesses.add(guessInput);
return true;
}
} catch (NumberFormatException nfe) {
System.out.println("Your input is not valid.");
}
return false;
}
在旁注中,方法名称isValid()
意味着只读读取器,当您修改状态时,这会产生误导。
答案 2 :(得分:0)
为此,我喜欢使用
public boolean isValid(String s) {
if (isNum(s)) {
Integer num = Integer.parseInt(s);
return inRange(num, maxGuess, minGuess);
}
return false;
}
private boolean inRange(Integer i, Integer max, Integer min) {
return (i < max && i >= min);
}
private boolean isNum(String s) {
return s.chars().allMatch(Character::isDigit);
}
正如其他人所提到的System.out.println("Your input is not valid.");
最好由isValid
函数的消费者完成,
将isValid
分解为较小的操作有助于 MURDER !
你可以阅读有关谋杀here
的内容答案 3 :(得分:0)
在你的循环中,如果你可以在for循环中准确地指定循环中断条件,那总是更好。
我一直认为break
是黑客/补丁/修复,绝不是解决方案。
答案 4 :(得分:0)
具体到你的例子中关于循环中break的使用的问题,我认为代码可读性没有差别,因为它太短了。
但是,总的来说我更喜欢中断方法,因为:
一旦结果设置为false,就没有理由继续执行。根据“guessInput”的长度以及编译器如何优化代码,具有中断的代码可以更高效。
虽然在你的例子中for循环中的代码很短,但实际上它可能会随着条件变得更复杂而增长。通过始终突破它应该的循环,当循环中的代码变得更长或更复杂时,遵循代码逻辑将变得更容易。
因此,我总是倾向于在循环中使用break。
答案 5 :(得分:-1)
如果您的目的是验证数字,任何数字,那么您将使用API,并在数字无效时处理异常。
警告:在您的代码中,如果您的字符串超过2147483647,则无论如何都会抛出异常而未处理,从而导致错误。
这是一个更好的版本,虽然我仍然主张在纯粹的检查方法中分配责任,而另一种方法是将其添加到猜测和/或打印内容中。
private boolean isValid(String guessInput)
{
try {
int guessInputInt = Integer.parseInt(guessInput);
if (guessInputInt >= minGuess && guessInputInt < maxGuess) {
guesses.add(guessInput);
} catch (NumberFormatException ex) {
System.out.println("Your input is not valid.");
return false;
}
return true;
}