Короткий пост присвячується всім любителям ЗВ та Java/JavaRush на честь 40-річчя виходу V епізоду зоряної саги! Іноді на просторах інтернету можна зустріти багато цікавих речей, от і днями мені на очі попалася досить кумедна на перший погляд програмістська практика під назвою Yoda conditions . Якщо коротко, умови Йоди (також нотація Йоди) - це стиль програмування, у якому дві частини звичного нам висловлювання порівняння в умовних операторах перевернуты:
дев'яти шести частин Саги, ми, не виспавшись, сіли писати якийсь код для свого pet-проекту і написали таке:
if (5 == a) {
// do something
}
Такий стиль може використовуватися в мовах із С-подібним синтаксисом, найчастіше у виразах з if
і while
.
if (0 == variable) {
// do something
}
while (false == endingCondition) {
// do something
}
Навіщо зрушувати константний вираз у ліву частину від оператора порівняння? Припустимо гіпотетичну ситуацію, коли після марафону-перегляду всіх
void checkNumber(int a)
{
if (a = 13) // Здесь-то и появляется так называемый unexpected behavior!
{
printf("Number is 13");
}
}
В даному випадку, при кожному запуску програми у вас буде видаватися рядок Number is 13"
незалежно від переданого аргументу а
в метод checkNumber(int a)
. Це не те, що ми очікували! Логічні помилки досить часто можуть зустрічатися у програмістів-початківців (believe me, I KNOW). Але на етапі компіляції код типу 13 = а буде видавати помилку, яку ми аж ніяк не переглянемо, так як ціле чисельне значення є константою і, відповідно, не може змінюватися (перетворитися на "а").
У застосуванні умов Йоди є як свої плюси, так і свої мінуси.
Light Side:
-
Запобігання присвоюванню значення змінної, коли метою є порівняння.
-
Вирішення проблеми небезпечної "Нульової поведінки" (
NullPointerException
) // приклади з Вікіпедії
Без Йоди:
String myString = null;
if (myString.equals("foobar")) { /* ... */ }
// This causes a NullPointerException in Java
З Йодою:
String myString = null;
if ( "foobar".equals(myString) ) { // Результат - Ложь
/* не выполняется */
}
Dark Side:
- Читання коду для людей, які дивитися твій код, ускладнюється, збільшуючи навантаження для сприйняття коду.
- Вузька сфера застосування, використовується тільки порівняння на рівність або порівняння з константою, перевірка на null.
- Багато компіляторів вже "бачить" подібні помилки і заздалегідь попереджають про наявність потенційної помилки.