Selama ulasan kode baru-baru ini saya diminta untuk meletakkan default
case di semua file di mana pun switch
blok digunakan, bahkan jika tidak ada hubungannya default
. Itu berarti saya harus meletakkan default
kasing dan tidak menulis apa pun di dalamnya.
Apakah ini hal yang benar untuk dilakukan? Apa tujuannya?
Jawaban:
Tampaknya ada tiga kasus ketika
default
pernyataan tidak diperlukan:tidak ada case lain yang tersisa, karena ada sejumlah nilai yang masuk
switch case
. Tapi ini mungkin berubah seiring waktu (sengaja atau tidak sengaja), dan akan lebih baikdefault case
jika ada perubahan apa pun _ Anda bisa mencatat atau memperingatkan pengguna tentang nilai yang salah.Anda tahu bagaimana dan di mana
switch case
akan digunakan dan nilai apa yang akan memasukinya. Sekali lagi, ini mungkin berubah dan pemrosesan ekstra mungkin diperlukan.kasus lain tidak memerlukan pemrosesan khusus. Jika ini masalahnya, saya pikir Anda diminta untuk menambahkan
default case
, karena ini adalah gaya pengkodean yang diterima, dan itu membuat kode Anda lebih mudah dibaca.Dua kasus pertama didasarkan pada asumsi. Jadi (dengan asumsi Anda bekerja di tim yang tidak terlalu kecil karena Anda memiliki ulasan kode reguler), Anda tidak mampu membuat asumsi tersebut. Anda tidak tahu siapa yang akan bekerja dengan kode Anda atau membuat panggilan ke fungsi / memanggil metode dalam kode Anda. Demikian pula, Anda mungkin perlu bekerja dengan kode orang lain. Memiliki gaya pengkodean yang sama akan memudahkan untuk berurusan dengan kode seseorang (termasuk Anda).
sumber
throw new IllegalStateException("Unrecognised case "+myEnum)
yang menunjukkan kepada Anda di mana dan apa kesalahannya.else
klausa setelah setiapif/else if
bahkan jika Anda tahu itu tidak boleh terjadi? Sepertinya bukan ide yang baik bagi saya ...Bukan tidak biasa bagi standar pengkodean perusahaan untuk meminta kasing standar untuk semua
switch
pernyataan. Salah satu alasannya adalah karena itu memudahkan pembaca untuk menemukan bagian akhirswitch
. Alasan lain yang mungkin lebih baik adalah membuat Anda berpikir sejenak tentang apa yang harus dilakukan kode Anda ketika kondisinya tidak sesuai dengan harapan Anda. Apa pun alasannya, jika itu merupakan standar perusahaan, Anda harus mengikutinya kecuali ada alasan kedap udara untuk tidak melakukannya.Jika Anda yakin bahwa Anda
switch
menyertakan case untuk setiap kondisi yang memungkinkan, maka hal yang baik untuk dilakukan adalah memasukkanassert
pernyataan dalam case default. Dengan begitu, ketika seseorang mengubah kode dan secara tidak sengaja menambahkan kondisi yangswitch
tidak Anda liput, mereka akan menekanassert
dan menyadari bahwa mereka perlu mengatasi bagian kode itu.Jika Anda
switch
hanya mencakup beberapa kondisi yang mungkin, tetapi tidak ada yang istimewa yang harus dilakukan untuk yang lain, Anda dapat membiarkan case default kosong. Adalah ide yang baik untuk menambahkan komentar dalam kasus itu untuk menunjukkan bahwa kasus default sengaja dikosongkan karena kondisi yang menabraknya tidak memerlukan pekerjaan apa pun untuk dilakukan.sumber
assert
?Jika Anda "beralih" pada tipe enumerasi murni, berbahaya memiliki fallback default. Saat nanti Anda menambahkan nilai ke tipe enumerasi, kompiler akan menyoroti sakelar dengan nilai baru yang tidak tercakup. Jika Anda memiliki klausa default di sana, kompiler akan tetap diam, dan Anda mungkin melewatkannya.
sumber
Dalam banyak hal, pertanyaan ini adalah sama dengan sering bertanya Apakah saya perlu sebuah
else
klausul pada akhir sebuahif
/else if
tangga yang mencakup setiap pilihan .Jawabannya adalah, secara sintaksis, tidak Anda tidak. Namun ada ...
Sebuah
default
klausul bisa berada di sana untuk (setidaknya) dua alasan:otherwise
dari case. Tidak ada alasan apapun untuk tidak memasukkan ini dalam kode sumber.Filosofi saya selalu cukup sederhana - menilai skenario kasus terburuk dari dua opsi, dan mencari yang paling aman. Dalam hal klausa kosong
else
ataudefault
, pilihan kasus terburuk adalah:Overdramatic? Mungkin ... tetapi kemudian perangkat lunak saya memiliki potensi membunuh orang jika terjadi kesalahan. Saya lebih suka tidak mengambil risiko itu.
Sebagai tambahan, pedoman MISRA-C {lihat profil untuk afiliasi} merekomendasikan
default
klausa untuk setiapswitch
sumber
else
setelahif
. Tetapi seperti yang Anda katakan, tidak, tidak.Java tidak memaksa Anda untuk memiliki pernyataan 'default' tetapi itu adalah praktik yang baik untuk memiliki satu sepanjang waktu, bahkan jika kodenya mungkin tidak pernah tercapai (sekarang). Berikut beberapa alasan:
Dengan memiliki klausa default yang tidak terjangkau Anda menunjukkan pembaca kode Anda bahwa Anda mempertimbangkan nilai-nilai dan tahu apa yang Anda lakukan. Anda juga mengizinkan untuk perubahan di masa mendatang, misalnya, misalnya: nilai enum baru ditambahkan, sakelar seharusnya tidak mengabaikan nilai baru secara diam-diam; Anda bisa melempar Pengecualian ke sana atau melakukan sesuatu yang lain.
Untuk menangkap nilai tak terduga (jika Anda tidak mengaktifkan enum) yang diteruskan - mungkin lebih besar atau kurang dari apa yang Anda harapkan, misalnya.
Untuk menangani tindakan 'default' - di mana switch untuk perilaku khusus. Sebagai contoh, sebuah variabel dapat dideklarasikan di luar switch tetapi tidak diinisialisasi dan setiap kasus menginisialisasi ke sesuatu yang berbeda. Default dalam hal ini dapat menginisialisasi ke nilai default sehingga kode segera setelah switch tidak kesalahan / melempar pengecualian.
Bahkan jika Anda memutuskan untuk tidak memasukkan apa pun dalam default (tidak ada pengecualian, logging, dll.) Maka bahkan komentar yang mengatakan bahwa Anda telah mempertimbangkan fakta bahwa default tidak akan pernah terjadi dapat membantu keterbacaan kode Anda; tapi itu turun ke preferensi pribadi.
sumber
Saya juga akan menambahkan bahwa itu tergantung pada filosofi bahasa yang Anda gunakan. Di Erlang misalnya, di mana itu merupakan pendekatan umum untuk 'membiarkannya crash', Anda tidak akan mendefinisikan kasus default tetapi membiarkan
case
pernyataan Anda menimbulkan kesalahan jika terjadi situasi yang tidak dipenuhi.sumber
Anda harus selalu memiliki default kecuali Anda telah membuktikan dan secara permanen menutupi semua kasus. Tidak ada biaya apapun, dan itu merupakan jaminan terhadap kegagalan mempertahankan pernyataan peralihan Anda dalam program yang terus berkembang.
Jika Anda benar-benar yakin tidak peduli dengan kasus lain, default: break; // tidak peduli tapi default defaultnya harus seperti default: throw new Error ("value tak terduga");
Demikian juga, Anda tidak boleh "menerobos" konstruksi kasus nontrivial tanpa menambahkan komentar pada efek yang ingin Anda lewatkan. Java salah dalam tahap desain.
sumber
Mempertimbangkan
dan
Saya berpendapat bahwa ini lebih unggul daripada memiliki kasus MALE, kasus FEMALE, dan kasus default yang melempar pengecualian.
Selama fase pengujian Anda, komputer akan memeriksa apakah g adalah PEREMPUAN. Selama produksi, cek akan dihilangkan. (Ya optimasi mikro!)
Lebih penting lagi, Anda akan mempertahankan tujuan Anda dari cakupan kode 100%. Jika Anda menulis case default yang melempar Exception, bagaimana Anda akan mengujinya?
sumber
Gender . FEMALE . equals ( FEMALE ) ;
evaluasi dilakukanfalse
? Maksud Anda,Gender.FEMALE.equals (g)
tetapi karena Anda dapat bergantung pada referensi untuk enum menjadi stabil, Anda cukup menulisg == Gender.FEMALE
. 4. (Pendapat pribadi) kode seperti itu jauh lebih sulit dibaca dan akan menghasilkan kesalahan yang sedikit membingungkan.