私は現在、Robert C. Martinによる「クリーンコード:アジャイルソフトウェアのクラフトマンシップのハンドブック」を読んで作業しています。著者は、関数が1つのことだけを行うべきであり、したがって比較的短い方法について話します。具体的にはマーティンはこう書いている:
これは、ifステートメント、elseステートメント、whileステートメントなど内のブロックが1行の長さであることを意味します。おそらくその行は関数呼び出しでなければなりません。これにより、囲まれた関数が小さく保たれるだけでなく、ブロック内で呼び出された関数にわかりやすい名前を付けることができるため、記録的な価値が追加されます。
これは、関数が入れ子構造を保持するのに十分な大きさであってはならないことも意味します。したがって、関数のインデントレベルは1または2以下にする必要があります。もちろん、これにより機能が読みやすくなり、理解しやすくなります
これは理にかなっていますが、私がクリーンなコードと見なしているものの例と矛盾しているようです。たとえば、次の方法を考えます。
public static boolean millerRabinPrimeTest(final int n) {
final int nMinus1 = n - 1;
final int s = Integer.numberOfTrailingZeros(nMinus1);
final int r = nMinus1 >> s;
//r must be odd, it is not checked here
int t = 1;
if (n >= 2047) {
t = 2;
}
if (n >= 1373653) {
t = 3;
}
if (n >= 25326001) {
t = 4;
} // works up to 3.2 billion, int range stops at 2.7 so we are safe :-)
BigInteger br = BigInteger.valueOf(r);
BigInteger bn = BigInteger.valueOf(n);
for (int i = 0; i < t; i++) {
BigInteger a = BigInteger.valueOf(SmallPrimes.PRIMES[i]);
BigInteger bPow = a.modPow(br, bn);
int y = bPow.intValue();
if ((1 != y) && (y != nMinus1)) {
int j = 1;
while ((j <= s - 1) && (nMinus1 != y)) {
long square = ((long) y) * y;
y = (int) (square % n);
if (1 == y) {
return false;
} // definitely composite
j++;
}
if (nMinus1 != y) {
return false;
} // definitely composite
}
}
return true; // definitely prime
}
}
このコードは、Apache Commonsのソースコードリポジトリのhttps://github.com/apache/commons-math/blob/master/src/main/java/org/apache/commons/math4/primes/SmallPrimes.java
メソッドは私には非常に読みやすく見えます。このようなアルゴリズムの実装(Miller-Rabin Probabilistic Primality Testの実装)の場合、本に定義されているように、コードをそのまま維持し、それを「クリーン」と見なすことは適切ですか?または、アルゴリズムを本質的に「1つのことだけを行う」関数への一連の呼び出しにするメソッドを抽出することから、これと同じくらい読みやすいものになるでしょうか?メソッド抽出の簡単な例の1つは、最初の3つのifステートメントを次のような関数に移動することです。
private static int getTValue(int n)
{
int t = 1;
if (n >= 2047) {
t = 2;
}
if (n >= 1373653) {
t = 3;
}
if (n >= 25326001) {
t = 4;
}
return t;
}
注:この質問は重複の可能性とは異なります(この質問は私にとっても役立ちます)。私はClean Codeの作者の意図を理解しているかどうかを判断しようとしているため、具体的な例を提供して、さらに詳しく説明しています。コンクリート。