【发布时间】:2013-11-26 12:17:06
【问题描述】:
我正在尝试 TDD 教程并想编写好的代码。我遇到了使用循环重复代码的问题。
我的代码如下所示:
public Board(int rows, int columns) {
this.rows = rows;
this.columns = columns;
blocks = new Block[rows][columns];
for (int row = 0; row < rows; row++) {
for (int col = 0; col < columns; col++) {
blocks[row][col] = new Block('.');
}
}
}
public boolean hasFalling(){
boolean falling = false;
for (int row = 0; row < rows; row++) {
for (int col = 0; col < columns; col++) {
if(blocks[row][col].getChar() == 'X'){
falling = true;
}
}
}
return falling;
}
public String toString() {
String s = "";
for (int row = 0; row < rows; row++) {
for (int col = 0; col < columns; col++) {
s += blocks[row][col].getChar();
}
s += "\n";
}
return s;
}
如您所见,我在不同的方法中使用相同的 for 循环。有没有办法避免这种情况以及如何避免这种情况?
我正在使用 Java 编程。
【问题讨论】:
-
您应该摆脱
boolean falling = false;,将falling = true;更改为return true;,并将return falling;更改为return false;...不是问题的答案,只是评论。 .. -
@nhgrif 这只是个人喜好问题。我个人会像他一样这样做,因为我只在方法的末尾(有一些例外)返回语句
-
@mvieghofer 如果您只使用一个返回值,那么至少在 if 语句中放置一个中断,这样当您已经知道答案时就不会循环遍历矩阵的其余部分
-
主要的一点是他应该在他知道他可以
return true的那一刻完全跳出for循环,并避免检查每个元素。 -
@dkatzel 是的。但是他还需要在
inner for loop之后使用if语句来执行if(falling){break;}以避免迭代更多的外部循环。简单地来自inner loop的return true-ing 更干净,imo。
标签: java loops refactoring duplicates