我正在尝试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编程。
答案 0 :(得分:6)
我认为你正在采取“避免代码重复”的好代码的想法有点过于严肃。确实,您应该避免重复代码,因为这会使您更难以阅读和维护代码。但循环是控制语句,不需要避免。它类似于if
语句,虽然您会在代码中多次使用这些语句,但您不会将if放入额外的方法中。
然而,如果你真的想这样做,你可以为for循环中的每个代码块创建一个Runnable,并创建一个这样的方法:
public void loop(Runnable runnable) {
for (int row = 0; row < rows; row++) {
for (int col = 0; col < columns; col++) {
runnable.run();
}
}
}
然后,您可以将所需的Runnable传递给该方法(您可能还需要以某种方式将参数传递给runnable)。有关详细信息,请参阅this post on SO
答案 1 :(得分:3)
我不确定如何简化所有循环(我并不完全确定你需要/想要)但你基本上可以消除hasFalling()方法中的大部分代码。相反,你可以这样做:
public boolean hasFalling(){
return toString().contains('X');
}
答案 2 :(得分:0)
有两点需要注意:
如果您在多个地方拥有完全相同的for loop
块,则应将其分解为函数。
此外,如果你有完全相同的循环,你的架构会很糟糕。您只需运行一次循环并使其可用于关注它的事物 - 可能通过一个getter函数将该循环的结果返回给它的任何调用。
在你的情况下,所有这些都是无关紧要的。您的for loops
不一样。仅仅因为你有循环并不重要......你在循环中做的事情是不同的。
你确实遇到了一个很大的问题,使你的代码难以理解,并且会给你带来很多困难。了解依赖注入。您的功能显然需要blocks
才能工作,但在进一步检查功能之前,这一点尚不清楚。如果你的函数需要(取决于)blocks
,那么它应该传递给它。
像hasFalling(blocks)
一样重构,以使事情更加清晰。全球状态是糟糕的做法,从长远来看会毁了你。 Ditch globals并声明你的依赖。