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,我一直在为游戏制定一些规则,我经历了如何在逻辑上做到这一点,并提出了上面的代码,它正常工作,但看起来有点混乱 - 是否有更简洁的方式或更有效的方式编写此代码?任何指针都非常感激。
答案 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());
}