Saat ini saya membaca dan bekerja melalui "Kode Bersih: Buku Panduan Pengerjaan Perangkat Lunak Agile" oleh Robert C. Martin. Penulis berbicara tentang bagaimana suatu fungsi seharusnya melakukan satu hal saja, dan dengan demikian relatif singkat. Secara khusus Martin menulis:
Ini menyiratkan bahwa blok-blok di dalam pernyataan if, pernyataan lain, pernyataan sementara, dan seterusnya harus sepanjang satu baris. Mungkin saluran itu harus menjadi pemanggilan fungsi. Ini tidak hanya menjaga fungsi penutup tetap kecil, tetapi juga menambah nilai dokumenter karena fungsi yang disebut di dalam blok dapat memiliki nama deskriptif yang bagus.
Ini juga menyiratkan bahwa fungsi tidak boleh cukup besar untuk menampung struktur bersarang. Oleh karena itu, level indent suatu fungsi tidak boleh lebih besar dari satu atau dua. Ini, tentu saja, membuat fungsi lebih mudah dibaca dan dimengerti
Ini masuk akal, tetapi tampaknya bertentangan dengan contoh-contoh dari apa yang saya lihat sebagai kode bersih. Ambil metode berikut ini misalnya:
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
}
}
Kode ini diambil dari repo kode sumber Apache Commons di: https://github.com/apache/commons-math/blob/master/src/main/java/org/apache/commons/math4/primes/SmallPrimes.java
Metode ini terlihat sangat mudah dibaca oleh saya. Untuk implementasi algoritma seperti ini (implementasi Miller-Rabin Probabilistic Primality Test), apakah cocok untuk menjaga kode seperti apa adanya dan masih menganggapnya 'bersih', seperti yang didefinisikan dalam buku ini? Atau bahkan sesuatu yang sudah dapat dibaca karena manfaat dari metode penggalian untuk membuat algoritma dasarnya serangkaian panggilan ke fungsi yang "melakukan satu hal saja"? Salah satu contoh cepat dari ekstraksi metode mungkin memindahkan tiga pernyataan-if pertama ke fungsi seperti:
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;
}
Catatan: Pertanyaan ini berbeda dengan kemungkinan duplikat (meskipun pertanyaan itu juga membantu saya), karena saya mencoba menentukan apakah saya memahami maksud dari penulis Kode Bersih dan saya memberikan contoh khusus untuk membuat lebih banyak hal beton.