Saya setuju dengan @MartinMaat tentang memilih pertempuran Anda.
Ada banyak kasus "berjaga-jaga" karena tidak benar-benar memahami bahasa meskipun bahasa telah diperbaiki dalam aturannya untuk banyak hal ini - alih-alih mengurung ekspresi yang tidak memerlukannya karena tidak memahami aturan diutamakan dari bahasa. Tapi tetap saja, praktik seperti itu sebagian besar tidak berbahaya.
Ketika saya masih muda, saya merasa bahwa kita harus mempelajari perincian bahasa dan dengan demikian menghindari penulisan kode yang berlebihan. (Salah satu kencing binatang peliharaan saya adalah return (0);
dengan parens yang tidak perlu.) Namun, saya sekarang memoderasi posisi itu, khususnya, karena kami menggunakan begitu banyak bahasa sekarang, melompat dari klien ke server, dll ... Jadi, saya sekarang memotong beberapa kendur untuk beberapa masalah seperti itu.
Anda poin tentang cyclomatic mulai pergi ke argumen yang beralasan logis. Mari kita lihat Kode Cakupan dan khususnya tingkat cakupan yang lebih tinggi :
- Setiap keputusan mengambil setiap kemungkinan hasil
Karena kami tidak dapat memaksa operasi baru untuk mengembalikan NULL, tidak ada cara untuk mencapai tingkat cakupan kode yang lebih tinggi untuk operasi bersyarat ini. Tentu saja, ini mungkin atau mungkin tidak penting bagi organisasi Anda!
Namun, karena masalah cakupan kode ini, saya akan memprioritaskannya lebih tinggi daripada terlalu banyak tanda kurung.
Di sisi lain, kode yang dihasilkan mungkin tidak akan menderita sedikitpun karena kode generasi, JIT, dan pengoptimal semua mengerti bahwa new
nilai ed tidak akan pernah menjadi nol. Jadi, biaya sebenarnya hanya datang dalam hal kemampuan membaca dan cakupan kode sumber.
Saya ingin bertanya seperti apa bentuk "bagian lain" dari pernyataan if itu?
Jika tidak ada bagian-lain, saya berpendapat bahwa hanya jatuh dari akhir rutin atau jatuh ke kode lain (yaitu tidak else
untuk ini if
) berpotensi berbahaya, karena sekarang ini "berjaga-jaga" secara logis menunjukkan bahwa penelepon dan / atau kode lebih lanjut di baris menangani NULL juga.
Jika berbunyi:
p = new Object ();
if ( p != null ) {
p.field = value;
}
else {
throw new NullReferenceException ();
}
maka ini benar-benar berlebihan, karena bahasa melakukan semua itu untuk kita.
Saya mungkin menyarankan membalikkan rasa bersyarat - mungkin rekan Anda akan lebih nyaman dengan ini:
p = new Object ();
if ( p == null ) {
throw new NullReferenceException ();
}
else {
p.field = value;
}
Sekarang Anda dapat berdebat untuk menghapus bungkus lain, karena itu jelas tidak perlu:
p = new Object ();
if ( p == null ) {
throw new NullReferenceException ();
}
p.field = value;
Dengan ini, "berjaga-jaga" sekarang apa yang bersyarat, sedangkan kode berikutnya tidak. Pendekatan ini semakin memperkuat bahwa ketika alokasi gagal, respons yang sesuai adalah melempar, daripada terus menjalankan kode dalam metode ini dan / atau dalam rantai panggilan ini (tanpa penanganan kegagalan alokasi lainnya yang tepat).
Jadi, secara ringkas ada dua argumen yang masuk akal untuk dibuat di sini terhadap praktik ini:
- Level cakupan kode yang lebih tinggi tidak dapat dicapai karena kami tidak dapat memaksakan kehabisan memori (atau kegagalan konstruktor) untuk mengembalikan nol.
- "Hanya dalam kasus" (seperti yang ditunjukkan di atas dalam pertanyaan) tidak lengkap dan dengan demikian cacat karena ketidakkonsistenan dalam harapan tentang bagaimana null akan ditangani oleh kode lain di luar / melewati kode
p.field = value;
.
Pada dasarnya, sepertinya rekan Anda ada di pagar tentang menggunakan pengecualian - meskipun tidak ada pilihan di C # untuk hal-hal seperti itu. ( Jika kita menginginkan kode yang telah teruji dengan baik, kita tidak dapat membuat kode untuk model pengecualian untuk menangani null dan model non-pengecualian menggunakan null-return-values, berdampingan). Mungkin jika Anda beralasan dengan rekan Anda melalui topik-topik ini, mereka akan melihat cahaya!