注:ループ内のロジックステートメントを避けたいという印象があります。これは、反復が予測可能な動作をするループをコンパイラがどのように最適化できるかによって部分的に述べられたと思います。私がほとんど確信している間に私はこれを以前に聞いたことがあり、長い間、私はこれを大会と考えていました。悲しいことに私は良い参考文献を見つけることができませんでした。しかし、これが本当であれば、 "DRY"原則(自分自身を繰り返さないでください)のためにいくつかの相反するケースがあります。ループのロジックは?または、むしろ2つの別々のほぼ同一のループですか?
PRETEXT:この例で使用したようにかなり大きなデータセット、たとえば多次元配列があると仮定します。さらに、すべてのエントリをトラバースして、要素のすべてまたは一部に対して何らかの操作を行う必要があること、およびその操作の1つまたは複数を実行することを選択できる必要があると仮定します。これは、コードの90%〜99%が2つのメソッドを作成することを要求しますが、演算子またはメソッド呼び出しのみが異なります。これがC++だったのであれば、ループ関数への関数ポインタを提供したいと思っていましたが、これも避けたいのか分かりません。
質問:ロジックステートメントを使用し、1つのループまたはむしろ2つのほぼ同じメソッドを使用することをお勧めしますか?
例:
// 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;
}
私は過度にしています(ほぼ)重複するコードを避けるために、ループ構造全体を保持するいくつかの一般的なメソッドを作成するように誘惑されました。しかし、 "私が聞いたこと"が合理的な文脈を持っていれば、これは私の知る限りでは避けるべきです。
あなたの質問に答えてください、私は2つの機能を持つ最初の例を使用します。少しのコードを繰り返してもかまいませんが、後でそれらの関数を使用するときにコードを読みやすくしています。ブール値が何を意味するかを調べる必要はありません。 – Mats391