有没有更简洁的方法来做到这一点? Java IF

时间:2011-02-15 23:19:58

标签: java

public void moveRowItemToBottomIfAllowed(int r, int f) {
    int i = rows[r].peek().getType();
    int j = 0;
    if (bottom[f].isEmpty()) {
        for (int k = 0; k < 4; k++) {
            if ((k == f) || (bottom[k].isEmpty()) || (bottom[k].peek().getType() != i)) {
                continue;
            }
            j = 1;
        }
        if (j == 0) {
            bottom[f].push(rows[r].pop());
        }
    } else if ((!bottom[f].isEmpty()) && (rankTrueFalse(rows[r].peek(), bottom[f].peek())) && (rows[r].peek().getType() == bottom[f].peek().getType())) {
        bottom[f].push(rows[r].pop());
    }
}

由于我还在学习java,我一直在为游戏制定一些规则,我经历了如何在逻辑上做到这一点,并提出了上面的代码,它正常工作,但看起来有点混乱 - 是否有更简洁的方式或更有效的方式编写此代码?任何指针都非常感激。

4 个答案:

答案 0 :(得分:3)

我希望extract methods使代码更具可读性。乍一看,我会提取

  • for循环,或者可能是if块的全部内容,
  • 来自第二长else if
  • 的表达式

为新方法使用描述性名称(对于您的变量也是如此)。这在可读性方面产生了巨大的差异。

答案 1 :(得分:1)

我建议您为变量使用更具描述性的名称。什么是r?什么是f?我猜测f是西装的某种数字表示,因为你将它与k进行比较,k迭代超过四个值。

关于整体代码可能还有更多内容,但第一步是以自我文档的方式编写代码。

答案 2 :(得分:1)

有些表达式可以提取到局部变量中:rows[r].peek()bottom[f].peek()是最明显的表达式。

答案 3 :(得分:0)

看起来您正在使用j作为标志。 Booleans对此更好,但是你可以return提前{而不是设置保护其余处理的条件,完全摆脱j

您仔细检查bottom[f].isEmpty())false,并且可以使用已查找的i而不是重复rows[r].peek().getType()

你的第一个条件的两个方面,如果他们最终进行处理,那么你可以写一次相同的处理:

public void moveRowItemToBottomIfAllowed(int r, int f) {
    int i = rows[r].peek().getType();

    if (bottom[f].isEmpty()) {
        for (int k = 0; k < 4; k++) {
            if (k == f) continue;
            if (bottom[k].isEmpty()) continue;
            if (bottom[k].peek().getType() == i) return;
        }
    } else {
        if (!rankTrueFalse(rows[r].peek(), bottom[f].peek())) return;
        if (bottom[f].peek().getType() != i) return;
    }

    bottom[f].push(rows[r].pop());
}

然后将此代码构建为一组具有早期退出的警卫,然后进行处理。

然后可以将守卫提取到他们自己的方法中,留下:

public void moveRowItemToBottomIfAllowed(int r, int f) {
    if (moveIsAllowed(r,f)) bottom[f].push(rows[r].pop());
}