Saya pribadi suka operator eksklusif atau , ^
ketika masuk akal dalam konteks pemeriksaan boolean karena keringkasannya. Saya lebih suka menulis
if (boolean1 ^ boolean2)
{
//do it
}
dari
if((boolean1 && !boolean2) || (boolean2 && !boolean1))
{
//do it
}
tapi saya sering bingung melihat dari pengembang Java berpengalaman lainnya (bukan hanya pemula), dan kadang-kadang komentar tentang bagaimana seharusnya hanya digunakan untuk operasi bitwise.
Saya ingin tahu tentang praktik terbaik terkait penggunaan ^
operator.
bool1 ^ bool2 ^ bool3
Lebih masuk akal bagiku daripadabool1 != bool2 != bool3
!=
menghasilkan hasil yang benar untukboolean
s (tetapi tidak untukBoolean
s jadi hati-hati). Ini tidak selalu cantik, misalnya(some != null) != (other != null)
tidak terlalu mudah dibaca. Anda juga harus mengekstrak bagian-bagian dalam boolean eksplisit, atau mengekstraknya!=
dalam metode terpisah.a ^ b
=> "a atau b tetapi tidak keduanya",a != b
=> "a tidak sama dengan b". (Apa yang dikatakan @RobertGrant). Sebagian besar manusia akan lebih mudah memahami yang pertama jika mereka tahu apa itu xor (yang cukup berguna untuk mengetahui apakah Anda berada di bidang komputasi ...)a != b
=> "a tidak IDENTIK untuk b"Saya pikir Anda telah menjawab pertanyaan Anda sendiri - jika Anda mendapat tampilan aneh dari orang lain, mungkin lebih aman untuk menggunakan opsi yang lebih eksplisit.
Jika Anda perlu berkomentar, maka Anda mungkin lebih baik menggantinya dengan versi yang lebih verbose dan tidak membuat orang bertanya terlebih dahulu.
sumber
(boolean1 && !boolean2) || (boolean2 && !boolean1)
dalam kode aplikasi kehidupan nyata ...Saya menemukan banyak percakapan serupa. Di satu sisi, Anda memiliki metode yang kompak, efisien untuk mencapai tujuan Anda. Di sisi lain, Anda memiliki sesuatu yang mungkin tidak dimengerti oleh anggota tim Anda lainnya, sehingga sulit untuk dipertahankan di masa depan.
Aturan umum saya adalah menanyakan apakah teknik yang digunakan adalah sesuatu yang masuk akal untuk diketahui oleh programmer secara umum. Dalam hal ini, saya pikir masuk akal untuk mengharapkan pemrogram mengetahui cara menggunakan operator boolean, jadi menggunakan xor dalam pernyataan if tidak apa-apa.
Sebagai contoh dari sesuatu yang tidak akan apa-apa, ambil trik menggunakan xor untuk bertukar dua variabel tanpa menggunakan variabel sementara. Itu adalah trik yang saya tidak berharap semua orang akan terbiasa, sehingga tidak akan melewati tinjauan kode.
sumber
Saya pikir tidak apa-apa jika Anda berkomentar, misalnya
// ^ == XOR
.sumber
Anda selalu bisa membungkusnya dalam suatu fungsi untuk memberikannya nama verbal:
Tetapi, bagi saya tampaknya tidak akan sulit bagi siapa pun yang tidak tahu apa artinya operator bagi Google dengan sangat cepat. Tidak akan sulit untuk diingat setelah pertama kali. Karena Anda meminta kegunaan lain, biasanya menggunakan XOR untuk masking bit.
Anda juga dapat menggunakan XOR untuk menukar nilai dalam dua variabel tanpa menggunakan variabel sementara ketiga .
Inilah pertanyaan Stackoverflow terkait dengan pertukaran XOR .
sumber
Saya baru-baru ini menggunakan xor dalam proyek JavaScript di kantor dan akhirnya menambahkan 7 baris komentar untuk menjelaskan apa yang terjadi. Pembenaran untuk menggunakan XOR dalam konteks itu adalah bahwa salah satu syarat (
term1
pada contoh di bawah) bisa mengambil bukan dua tapi tiga nilai:undefined
,true
ataufalse
sementara yang lain (term2
) bisatrue
ataufalse
. Saya harus menambahkan pemeriksaan tambahan untukundefined
kasus - kasus tetapi dengan xor, berikut ini sudah cukup karena xor memaksa istilah pertama yang pertama kali dievaluasi sebagai Boolean, membiarkanundefined
diperlakukan sebagaifalse
:Pada akhirnya, itu sedikit berlebihan, tapi aku tetap ingin tetap di sana, sebagai semacam telur paskah.
sumber
bool? a
nilai dapat secara eksplisit diuji untuk benar menggunakana == true
- apakah ada teknik serupa di java? Dalam C #, diberikan duabool?
nilai, "perlakukan null sebagai salah" akan mengarah ke(a == true) ^ (b == true)
. Formula setara adalah(a == true) != (b == true)
. Bisakah Anda melakukan hal serupa di java?IMHO kode ini dapat disederhanakan:
sumber
Dengan kejelasan kode dalam pikiran, pendapat saya adalah bahwa menggunakan XOR dalam pemeriksaan boolean bukanlah penggunaan khas untuk operator bitwise XOR. Dari pengalaman saya, bitwise XOR di Jawa biasanya digunakan untuk menerapkan
flag toggle
perilaku topeng :Artikel ini oleh Vipan Singla menjelaskan kasus penggunaan lebih detail.
Jika Anda perlu menggunakan bitwise XOR seperti dalam contoh Anda, beri komentar mengapa Anda menggunakannya, karena itu mungkin membutuhkan audiens yang sedikit melek huruf untuk berhenti di jalurnya untuk memahami mengapa Anda menggunakannya.
sumber
Saya pribadi lebih suka ekspresi "boolean1 ^ boolean2" karena ringkasnya.
Jika saya berada dalam situasi Anda (bekerja dalam tim), saya akan melakukan kompromi dengan merangkum logika "boolean1 ^ boolean2" dalam sebuah fungsi dengan nama deskriptif seperti "isDifferent (boolean1, boolean2)".
Misalnya, alih-alih menggunakan "boolean1 ^ boolean2", Anda akan memanggil "isDifferent (boolean1, boolean2)" seperti:
Fungsi "isDifferent (boolean1, boolean2)" Anda akan terlihat seperti:
Tentu saja, solusi ini memerlukan penggunaan pemanggilan fungsi yang tampaknya asing, yang dengan sendirinya tunduk pada pengawasan Praktik Terbaik, tetapi ia menghindari ekspresi verbose (dan jelek) "(boolean1 &&! Boolean2) || (boolean2 &&! Boolean1) "!
sumber
Jika pola penggunaan membenarkannya, mengapa tidak? Sementara tim Anda tidak mengenali operator segera, dengan waktu yang mereka bisa. Manusia belajar kata-kata baru setiap saat. Kenapa tidak dalam pemrograman?
Satu-satunya peringatan yang mungkin saya nyatakan adalah "^" tidak memiliki semantik hubung singkat dari cek boolean kedua Anda. Jika Anda benar-benar membutuhkan semantik hubung singkat, maka metode util statis juga berfungsi.
sumber
xor
, yang melakukan persis apa yang dilakukan oleh operator xor tetapi secara tidak langsung, akan memunculkan lebih banyak pertanyaan dalam pikiran saya (khususnya tentang kompetensi) daripada seorang programmer yang baru saja digunakan^
.! = OK untuk membandingkan dua variabel. Namun, itu tidak berfungsi dengan beberapa perbandingan.
sumber
Sebagai operator bitwise, xor jauh lebih cepat daripada cara lain untuk menggantinya. Jadi untuk perhitungan kritis dan terukur kinerja, xor sangat penting.
Pendapat pribadi subjektif saya: Sangat dilarang, untuk tujuan apa pun, untuk menggunakan kesetaraan (== atau! =) Untuk boolean. Menggunakannya menunjukkan kurangnya etika pemrograman dasar dan fundamental. Siapa pun yang memberi Anda pandangan bingung ^ harus dikirim kembali ke dasar-dasar aljabar boolean (saya tergoda untuk menulis "ke sungai kepercayaan" di sini :)).
sumber
terlihat lebih baik untukku daripada
sumber