[英]Exiting a loop in Java
我正在使用Java,但我想這個問題適用於任何語言。 我只是想問一下,使用布爾值退出循環是更好的做法,我在循環中切換或只使用break;
例如,我只是在寫一個方法來獲得國際象棋中女王的有效動作。
private static final int[][] DIRS = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}, {1, 1}, {-1, -1}, {-1, 1}, {1, -1}};
public Vector<Move> getValidMoves() {
Vector<Move> validMoves = new Vector<Move>();
for (int i = 0; i < DIRS.length; i++) {
boolean stopped = false;
int newX = x + DIRS[i][0];
int newY = y + DIRS[i][1];
while (!stopped && newX >= 0 && newX < 8 && newY >= 0 && newY < 8) {
if (board[newX][newY] == null) {
validMoves.add(new Move(x, y, newX, newY));
newX += DIRS[i][0];
newY += DIRS[i][1];
} else {
if (board[newX][newY].getColour() == colour) {
stopped = true;
} else {
validMoves.add(new Move(x, y, newX, newY));
stopped = true;
}
}
}
}
return validMoves;
}
如果我使用break退出while循環; 而不是像我這樣設置停止為真,這是我的理解,它運行更有效,但不是最好的代碼風格。
由於退出循環的唯一原因存在break
,我想不出更好的方法來做到這一點。
性能方面,沒關系,你在堆棧上分配1個布爾值,並在每次循環迭代時添加1個比較,所以沒什么好擔心的。
它主要取決於您是否要在退出之前完成剩余的循環代碼。 Break將立即退出並設置布爾值將在停止之前等待下一次迭代。
如果您不需要完成循環迭代,那么如果您使用break
,您的代碼將更容易閱讀
因為在這里使用布爾變量對性能沒有太大影響,所以這是關於可讀性的。 有些人認為使用break語句會降低代碼的可讀性,原因有兩個。
一個是當使用break語句時,用戶有時無法順序讀取代碼(需要跳轉讀取)。 這可能令人困惑,因為讀者需要確定break語句帶來下一個操作的位置。
另一個問題是,使用變量作為停止條件有助於讀者理解為什么在有意義地命名變量時它會被停止。 例如,如果你對停止條件使用isEmpty布爾變量,很明顯循環已經停止,因為無論什么都是空的。
我並不反對使用break語句,但我認為你應該做的是讓它盡可能可讀。
我建議你做你認為最清楚的事情。 恕我直言使用布爾值可以更清楚嵌套循環,但對於使用標志的簡單循環是不必要的冗長。
while (0 <= newX && newX < 8 && 0 <= newY && newY < 8) {
if (board[newX][newY] == null) {
validMoves.add(new Move(x, y, newX, newY));
newX += DIRS[i][0];
newY += DIRS[i][1];
} else {
if (board[newX][newY].getColour() != colour)
validMoves.add(new Move(x, y, newX, newY));
break;
}
}
絕對使用休息。 這就是關鍵字的用途,它會生成更簡潔的代碼,不會讓某人閱讀您的代碼,不知道循環中的“停止”來自何處,並且可能更快。
取決於你與誰交談。 我有一位大學教授發誓他會用正常的表情檢查來拍攝任何沒有退出控制結構(如循環)的學生。
然而,我已經看到,盡管可能是“紀律嚴明”,但有時候可以提前退出循環或其他控制結構。 考慮到這一點,我說“去吧”。 您仍然可以遵守紀律,並且具有可提前刪除的意外行為的可讀代碼(只要該退出將是離開該結構的正當理由。
這就是為什么語言中斷了。 我會用它。
像上面提到的用戶一樣,絕對使用break。 退出循環是它的目的。
似乎尚未提出的一點:
在Java中(不完全雖然),在退出嵌套循環會更優雅的break
不必嵌套在每個級別相同的條件下。 它還將使代碼更易於維護。
此外,它可以使循環的邏輯變得更加簡單,因為只要你達到破壞狀態,你就可以采取行動,而不是繼續執行代碼。 這也促進了循環體內的模塊化。
您可能想要從oracle網頁上了解break的用法
使用Break來退出循環是一種很好的做法。 然后,如果你使用或不使用取決於你。
現在,如果您想提高代碼的可讀性及其靈活性,可以考慮將復雜的循環分解為函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.