TL; DR: jangan gunakan argumen boolean.
Lihat di bawah mengapa mereka buruk, dan bagaimana cara menggantinya (dalam huruf tebal).
Argumen Boolean sangat sulit dibaca, dan karenanya sulit dipertahankan. Masalah utama adalah bahwa tujuannya umumnya jelas ketika Anda membaca metode tanda tangan di mana argumen tersebut dinamai. Namun, penamaan parameter umumnya tidak diperlukan di sebagian besar bahasa. Jadi Anda akan memiliki anti-pola seperti di RSACryptoServiceProvider#encrypt(Byte[], Boolean)
mana parameter boolean menentukan jenis enkripsi apa yang akan digunakan dalam fungsi tersebut.
Jadi, Anda akan menerima panggilan seperti:
rsaProvider.encrypt(data, true);
di mana pembaca harus mencari tanda tangan metode hanya untuk menentukan apa yang sebenarnya true
bisa berarti. Melewati bilangan bulat tentu saja sama buruknya:
rsaProvider.encrypt(data, 1);
akan memberitahu Anda sama banyak - atau lebih tepatnya: sama sedikit. Bahkan jika Anda mendefinisikan konstanta yang digunakan untuk integer maka pengguna fungsi mungkin mengabaikannya dan tetap menggunakan nilai literal.
Cara terbaik untuk menyelesaikan ini adalah dengan menggunakan enumerasi . Jika Anda harus lulus enum RSAPadding
dengan dua nilai: OAEP
atau PKCS1_V1_5
Anda akan segera dapat membaca kode:
rsaProvider.encrypt(data, RSAPadding.OAEP);
Boolean hanya dapat memiliki dua nilai. Ini berarti bahwa jika Anda memiliki opsi ketiga, maka Anda harus memperbaiki tanda tangan Anda. Umumnya ini tidak dapat dengan mudah dilakukan jika kompatibilitas ke belakang merupakan masalah, jadi Anda harus memperluas kelas publik apa pun dengan metode publik lain. Inilah yang akhirnya dilakukan Microsoft ketika mereka memperkenalkan di RSACryptoServiceProvider#encrypt(Byte[], RSAEncryptionPadding)
mana mereka menggunakan enumerasi (atau setidaknya kelas meniru enumerasi) alih-alih boolean.
Bahkan mungkin lebih mudah untuk menggunakan objek atau antarmuka penuh sebagai parameter, jika parameter itu sendiri perlu di-parameterkan. Dalam contoh di atas OAEP padding itu sendiri dapat diparameterisasi dengan nilai hash untuk digunakan secara internal. Perhatikan bahwa sekarang ada 6 algoritma hash SHA-2 dan 4 algoritma hash SHA-3, sehingga jumlah nilai enumerasi dapat meledak jika Anda hanya menggunakan enumerasi tunggal daripada parameter (ini mungkin hal berikutnya yang akan dicari tahu oleh Microsoft ).
Parameter Boolean juga dapat menunjukkan bahwa metode atau kelas tidak dirancang dengan baik. Seperti contoh di atas: pustaka kriptografis apa pun selain .NET tidak menggunakan flag padding dalam metode signature sama sekali.
Hampir semua guru perangkat lunak yang saya suka memperingatkan terhadap argumen boolean. Misalnya, Joshua Bloch memperingatkan mereka dalam buku yang sangat dihargai "Java Efektif". Secara umum mereka seharusnya tidak digunakan. Anda bisa berargumen bahwa mereka dapat digunakan jika ada satu parameter yang mudah dipahami. Tetapi meskipun demikian: Bit.set(boolean)
mungkin lebih baik diimplementasikan menggunakan dua metode : Bit.set()
dan Bit.unset()
.
Jika Anda tidak dapat langsung memperbaiki kode Anda dapat mendefinisikan konstanta untuk setidaknya membuatnya lebih mudah dibaca:
const boolean ENCRYPT = true;
const boolean DECRYPT = false;
...
cipher.init(key, ENCRYPT);
jauh lebih mudah dibaca daripada:
cipher.init(key, true);
bahkan jika Anda lebih suka:
cipher.initForEncryption(key);
cipher.initForDecryption(key);
sebagai gantinya.