ПРИМЕЧАНИЕ. У меня создается впечатление, что вы хотите избежать логических утверждений внутри циклов. Это, как мне кажется, частично объясняется тем, как компилятор может оптимизировать любой цикл, где итерации ведут себя предсказуемо. Хотя я почти уверен, что слышал это раньше и долгое время думал об этом как о конвенции. К сожалению, я не мог найти хороших ссылок. Если это правда, однако существуют некоторые противоречивые случаи из-за принципа «СУХОЙ» (не повторяйте себя).Логические внутренние петли? Или, скорее, две отдельные почти идентичные петли?
PRETEXT: Предполагая, что у вас довольно значительный набор данных, скажем, многомерный массив, как я использовал в этом примере. Кроме того, предположим, что вам нужно пройти каждую запись и выполнить некоторую операцию на всех или некоторых элементах, и вам нужно будет выбрать ту, что должна быть выполнена. Это требует создания двух методов, где 90% -99% кода идентичны между двумя, а другой оператор или вызов метода отличается. Если бы это был C++, я бы хотел предоставить указатель на функцию цикла, хотя я не знаю, будет ли это тоже предпочтительнее избегать.
ВОПРОС: Было бы предпочтительным использовать логические утверждения и иметь только один цикл или, скорее, два почти одинаковых метода?
Пример: я обеспечил некоторый пример, чтобы показать, как излишние "близнец" метод решение выглядит:
// This method is provided for completeness of the example
// and to provide some clue as to what boolean parameter and logic statement
// I could alternatively have implemented within the loop method instead of external to it.
public int[][] addOrSubtractArrays(int[][] a, int[][] b, boolean useAdd){
if(a == null || b == null || a.length != b.length || a.length < 1 || a[0].length != b.length)
return null;
return useAdd ? add(a, b) : subtract(a, b);
}
private int[][] add(int[][] a, int[][] b){
int h = a.length;
int w = a[0].length;
int[][] c = new int[h][w];
for(int y = 0; y < h; y++){
for(int x = 0; x < w; x++){
c[y][x] = a[y][x] + b[y][x];
}
}
return c;
}
private int[][] subtract(int[][] a, int[][] b){
int h = a.length;
int w = a[0].length;
int[][] c = new int[h][w];
for(int y = 0; y < h; y++){
for(int x = 0; x < w; x++){
c[y][x] = a[y][x] - b[y][x];
}
}
return c;
}
Пример 2: (? Очевидно) Альтернатива
private int[][] addOrSubtract(int[][] a, int[][] b, boolean useAdd){
if(a == null || b == null || a.length != b.length || a.length < 1 || a[0].length != b.length)
return null;
int h = a.length;
int w = a[0].length;
int[][] c = new int[h][w];
for(int y = 0; y < h; y++){
for(int x = 0; x < w; x++){
if(useAdd)
c[y][x] = a[y][x] + b[y][x];
else
c[y][x] = a[y][x] - b[y][x];
}
}
return c;
}
Я слишком соблазн сделать некоторый общий метод, удерживающий всю структуру цикла, чтобы избежать (почти) дублирования кода. Однако, если «то, что я слышал» имеет некоторый разумный контекст, это, насколько мне известно, лучше всего избегать.
Не могу ответить на ваш вопрос, но я бы использовал первый пример с двумя функциями. Вы можете повторить немного кода, но позже он упрощает чтение кода при использовании этих функций. Не нужно искать то, что означает булев. – Mats391