Sebuah postingan singkat didedikasikan untuk semua penggemar Star Wars dan Java / JavaRush untuk memperingati 40 tahun rilis Episode V dari saga bintang! Kadang-kadang Anda dapat menemukan banyak hal menarik di Internet, dan suatu hari saya menemukan praktik pemrograman yang sekilas lucu yang disebut kondisi Yoda . Singkatnya, kondisi Yoda (juga notasi Yoda) adalah gaya pemrograman di mana dua bagian dari ekspresi perbandingan yang lazim dalam pernyataan kondisional dibalik:
enam bagian Saga secara maraton, kita, tanpa tidur, duduk untuk menulis beberapa kode untuk proyek kesayangan kita dan menulis yang berikut:
if (5 == a) {
// do something
}
Gaya ini dapat digunakan dalam bahasa dengan sintaks mirip C, paling sering dalam ekspresi dengan if
dan while
.
if (0 == variable) {
// do something
}
while (false == endingCondition) {
// do something
}
Mengapa menggeser ekspresi konstanta ke sisi kiri operator perbandingan? Mari kita asumsikan situasi hipotetis di mana, setelah menonton sembilan void checkNumber(int a)
{
if (a = 13) // Здесь-то и появляется так называемый unexpected behavior!
{
printf("Number is 13");
}
}
Dalam hal ini, setiap kali Anda menjalankan program, Anda akan menerima string Number is 13"
, terlepas dari argumen yang diteruskan а
ke metode tersebut checkNumber(int a)
. Ini bukan yang kami harapkan! Kesalahan logika cukup sering terjadi di kalangan programmer pemula (percayalah, saya TAHU). Namun pada tahap kompilasi, kode seperti 13 = a akan menghasilkan error yang tentunya tidak akan kita abaikan, karena nilai integer adalah konstanta dan karenanya tidak dapat berubah (berubah menjadi “a”).
Ada pro dan kontra dalam menggunakan kondisi Yoda.
Sisi Terang:
-
Mencegah penugasan ke suatu variabel ketika tujuan kita adalah perbandingan.
-
Menyelesaikan masalah "Perilaku Null" yang tidak aman (
NullPointerException
) // contoh dari Wikipedia
Tanpa Yoda:
String myString = null;
if (myString.equals("foobar")) { /* ... */ }
// This causes a NullPointerException in Java
Dengan Yoda:
String myString = null;
if ( "foobar".equals(myString) ) { // Результат - Ложь
/* не выполняется */
}
Sisi gelap:
- Keterbacaan kode bagi orang-orang yang akan melihat kode Anda menjadi lebih kompleks, sehingga meningkatkan beban persepsi kode.
- Cakupan sempit, hanya perbandingan untuk kesetaraan atau perbandingan dengan konstanta yang digunakan, memeriksa nol.
- Banyak kompiler sudah “melihat” kesalahan semacam ini dan memperingatkan sebelumnya tentang adanya potensi kesalahan.
GO TO FULL VERSION