2

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

4

3 回答 3

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)。有关更多信息,请参见例如关于 SO 的这篇文章

于 2013-11-13T18:32:46.340 回答
3

I'm not sure how to simplify all the loops (and I'm not entirely sure you need/want to) but you can essentially eliminate most of the code in your hasFalling() method. Instead you could do this:

public boolean hasFalling(){
   return toString().contains('X');
}
于 2013-11-13T18:35:11.137 回答
0

有两点需要注意:

如果你在多个地方有完全相同的for loop块,你应该把它分解成一个函数。

此外,如果你有完全相同的循环,你的架构会很糟糕。您只需运行一次循环并使其可用于关心它的事物 - 可能通过一个 getter 函数将循环的结果返回给任何需要它的东西。

在你的情况下,所有这些都是无关紧要的。你for loops的不一样。仅仅因为你有循环在这里并不重要......你对循环所做的事情是不同的。

您确实有一个大问题,使您的代码难以理解,并可能给您带来很多困难。了解依赖注入。您的功能显然需要blocks才能工作,但在进一步检查功能之前还不清楚。如果您的函数需要 (depend on) blocks,则应将其传递给它。

像这样重构hasFalling(blocks)以使事情更清楚。全局状态是一种糟糕的做法,从长远来看会毁了你。抛弃全局变量并声明你的依赖项。

于 2013-11-13T18:41:30.860 回答