JavaRush /Java блог /Random UA /Умови Йоди або Yoda conditions
MAX
16 рівень
Киров

Умови Йоди або Yoda conditions

Стаття з групи Random UA
Короткий пост присвячується всім любителям ЗВ та Java/JavaRush на честь 40-річчя виходу V епізоду зоряної саги! Умови Йоди або Yoda conditions - 1Іноді на просторах інтернету можна зустріти багато цікавих речей, от і днями мені на очі попалася досить кумедна на перший погляд програмістська практика під назвою Yoda conditions . Якщо коротко, умови Йоди (також нотація Йоди) - це стиль програмування, у якому дві частини звичного нам висловлювання порівняння в умовних операторах перевернуты:

if (5 == a) {
    // do something
}
Такий стиль може використовуватися в мовах із С-подібним синтаксисом, найчастіше у виразах з ifі while.

if (0 == variable) {
    // do something
}

while (false == endingCondition) {
    // do something
}
Навіщо зрушувати константний вираз у ліву частину від оператора порівняння? Припустимо гіпотетичну ситуацію, коли після марафону-перегляду всіх дев'яти шести частин Саги, ми, не виспавшись, сіли писати якийсь код для свого pet-проекту і написали таке:

void checkNumber(int a)
{
    if (a = 13) // Здесь-то и появляется так называемый unexpected behavior!
    {
        printf("Number is 13");
    }
}
В даному випадку, при кожному запуску програми у вас буде видаватися рядок Number is 13"незалежно від переданого аргументу ав метод checkNumber(int a). Це не те, що ми очікували! Логічні помилки досить часто можуть зустрічатися у програмістів-початківців (believe me, I KNOW). Але на етапі компіляції код типу 13 = а буде видавати помилку, яку ми аж ніяк не переглянемо, так як ціле чисельне значення є константою і, відповідно, не може змінюватися (перетворитися на "а"). Умови Йоди або Yoda conditions - 1

У застосуванні умов Йоди є як свої плюси, так і свої мінуси.

Light Side:

  1. Запобігання присвоюванню значення змінної, коли метою є порівняння.

  2. Вирішення проблеми небезпечної "Нульової поведінки" ( NullPointerException) // приклади з Вікіпедії

  3. Без Йоди:

    
    String myString = null;
    if (myString.equals("foobar")) { /* ... */ }
    // This causes a NullPointerException in Java

    З Йодою:

    
    String myString = null;
    if ( "foobar".equals(myString) ) { // Результат - Ложь
       /* не выполняется */ 
    }

Dark Side:

  1. Читання коду для людей, які дивитися твій код, ускладнюється, збільшуючи навантаження для сприйняття коду.
  2. Вузька сфера застосування, використовується тільки порівняння на рівність або порівняння з константою, перевірка на null.
  3. Багато компіляторів вже "бачить" подібні помилки і заздалегідь попереджають про наявність потенційної помилки.
Альтернативою нотації Йоди можуть бути unit-тести. За часів Старої Республіки подейкували, що проведення якісного тестування дасть гарантію того, що код буде без помилок і робитиме лише те, для чого він писався. А які корисні практики ви знаєте? Поділіться знаннями у коментарях! А також напишіть ваш улюблений епізод! And may the Force be with you!
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ