Add operator dari kelas set mengembalikan boolean yang benar jika elemen (yang akan ditambahkan) belum ada di sana, dan false jika tidak. Sedang menulis
if (set.add(entry)) {
//do some more stuff
}
dianggap gaya yang baik dalam hal menulis kode bersih? Saya ingin tahu karena Anda melakukan dua hal sekaligus. 1) menambahkan elemen dan 2) memeriksa apakah elemen tersebut ada.
java
coding-style
clean-code
Andreas Braun
sumber
sumber
java.util.Set
, yang mengembalikan trueadd
ketika elemen itu belum ada di sana, kan?if (!set.add(entry)) {// entry already present, possibly a case you want to handle}
Jawaban:
Ya itu.
Titik biasa dari operasi mengembalikan nilai Boolean adalah bahwa Anda dapat menggunakannya untuk membuat keputusan, yaitu dalam
if
konstruk. Satu-satunya cara Anda dapat menyadari potensi ini adalah dengan menyimpan nilai kembali dalam variabel dan kemudian segera menggunakannya kembali dalamif
, yang hanya konyol dan tentu saja tidak dengan cara apa pun lebih baik daripada menulisif(operation()) { ... }
. Jadi silakan saja dan lakukan itu, kami tidak akan menghakimi Anda (untuk itu).sumber
Set.add
sebagai operasi tunggal tanpa menyebutkan alternatif. Jika operasi yang dimaksudkan adalah untuk menambahkan elemen tunggal dan mencari tahu apakah telah ditambahkan, tidak perlu alternatif yang lebih kuat yang masih mempersulit operasi tanpa manfaat. Saya harap Anda sadar bahwaSet.add
ini adalah metode JRE bawaan yang dapat digunakan tanpa mempelajari buku> 700 halaman terlebih dahulu.Saya akan mengatakan itu tidak sebersih mungkin, karena memaksa pengelola untuk sudah tahu atau mencari tahu apa nilai kembaliannya. Apakah ini berarti nilai sudah ada, tidak sudah ada, berhasil dimasukkan? Jika Anda tidak sering menggunakannya, Anda tidak akan tahu, dan bahkan jika Anda menggunakannya, itu adalah beban mental yang jauh lebih besar.
Saya lebih suka yang berikut ini:
Ya, sedikit lebih banyak verbose, tetapi kompiler harus menghasilkan bytecode yang persis sama, dan bahkan orang-orang yang tidak menggunakan set Java bertahun-tahun dapat mengikuti logika tanpa melihat apa-apa.
sumber
add
mengembalikan true jika elemen belum ada di sana, tidak jika itu ada. (Kata-kata pertanyaan itu menyesatkan.)Set.add
, Anda tidak berpengalaman dan Anda harus mencari metode ini untuk mempelajarinya dan menjadi lebih berpengalaman.notAlreadyPresent
bukan kata-kata terbaik. Saya akan menggunakanadded
, dan berharap pembaca tahu mengapa suatu nilai tidak akan ditambahkan ke Set.Jika true berarti sukses, maka itu kode yang baik dan jelas.
Ada konvensi luas bahwa suatu fungsi atau metode mengembalikan true (atau sesuatu yang mengevaluasi true) pada kesuksesan. Selama kode Anda mengikuti itu, saya pikir menempatkan metode dalam kondisi baik-baik saja.
Kode seperti ini tidak perlu berantakan dalam pandangan saya:
Rasanya seperti Anda mengulangi sendiri.
Namun, pertanyaannya tidak jelas tentang arti nilai kembali. Anda mengatakan "boolean yang menunjukkan apakah elemen yang ditambahkan sudah ada", yang mungkin menyiratkan bahwa true berarti elemen itu ada (dan menambahkan tidak terjadi). Jika demikian, saya idealnya mengubah perilaku pengembalian metode menjadi lebih konvensional. Jika itu tidak memungkinkan, saya akan menambahkan variabel perantara tambahan yang memungkinkan Anda untuk dengan jelas memberi label hasil pengembalian dalam kode Anda (seperti yang disarankan oleh orang lain).
sumber
false
berarti elemen tidak ditambahkan karena sudah terkandung, dantrue
berarti elemen belum terkandung. Sepertiadd()
menambahkan elemen ke set jika set belum mengandungnya,true
karena itu berarti elemen berhasil ditambahkan ke set.add
berhasil tanpa harus melakukan apa pun. Jika item belum di set,add
berhasil dengan menambahkan item ke set. Penafsiran mana yang benar adalah arbitrer. Definisi sukses yang kurang sembarangan adalah definisi dari bahasa: metode berhasil jika kembali secara normal.firstLessThanSecond(int l, int r)
, dan itu mengembalikantrue
jikal > r
ataufalse
jikal <= r
, maka metode itu tidak berhasil, meskipun itu kembali secara normal.add
adalah singkatan dari kontrak. Dokumentasi dimulai dengan "Menambahkan elemen yang ditentukan ke set ini jika belum ada", yang puas apakah item sudah dalam set atau tidak. Anda bebas menginterpretasikan nilai pengembalian sesuai keinginan Anda, tetapi pada akhirnya itu hanya interpretasi Anda. Dan dalam contoh kedua Anda, metode mengevaluasi apakah suatu kondisi benar. Jika kondisinya salah, metode tersebut pasti tidak gagal, karena telah berhasil mengevaluasi kondisi tersebut.Saya akan mengatakan itu sangat seperti C. Sebagian besar waktu saya lebih suka memiliki variabel yang dinamai secara deskriptif untuk hasil mutasi, dan tidak ada mutasi yang terjadi dalam suatu
if
kondisi.Kompiler akan menghilangkan variabel ini jika langsung digunakan kembali. Manusia akan lebih mudah membaca sumbernya; bagi saya, ini lebih penting.
Jika seseorang harus memperpanjang kondisi dengan menambahkan
and
/or
klausa ke kondisi if, mereka mungkin akhirnya tidak menelepon.add()
dalam kasus-kasus tertentu karena evaluasi hubungan pendek. Kecuali jika korsleting diantisipasi secara khusus, ini mungkin berakhir sebagai bug.sumber
if (set.contains(entry)){set.add(entry); //do more stuff}
apakah itu juga dihilangkan oleh kompiler?contains
danadd
. Selain itu, ini berfungsi ganda dalam memandangentry
set; ini mungkin memainkan peran untuk set yang sangat besar dan loop yang sangat ringan.if (set.contains(entry)){set.add(entry); //do more stuff}
tetapi pergi dengan misalnya jawaban Karl Bielefeldt?Kode Anda tampaknya memecah Command Query Separation . Ini dibahas dalam buku Kode Bersih dan video Function Structure . Jadi dari perspektif Clean Code saya pikir itu tidak dianggap gaya yang baik.
Bagi saya maksud kode Anda tidak jelas. Apakah jika keduanya dieksekusi ketika entri ditambahkan berhasil, atau juga ketika sudah ada? Apa yang
add()
kembali? barang itu? Kode kesalahan?sumber
if (set.contains(entry)){set.add(entry); //do more stuff}
yang sepertinya konyol. Apa pendapat Anda tentang ini?Collection
api.