如何在多个函数中重构重复循环

时间:2013-11-13 18:26:55

标签: java loops refactoring duplicates

我正在尝试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编程。

3 个答案:

答案 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并声明你的依赖。