Короткий пост посвящается всем любителям ЗВ и 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.
- Многие компиляторы уже "видят" ошибки подобного рода и заранее предупреждают о наличии потенциальной ошибки.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ