Мастер Йода, наставник программистов
―Оружие убери! Плохого не сделаю. Знать хочу - зачем ты здесь?
Сидел недавно, бился над проблемой, предотвратить было легко которую, если бы мой коллега применил заветы мастера Йоды.
В русском языке наверное не так очевидно, а во многих европейских языках порядок слов в предложении фиксирован более менее жестко. Сначала идет субъект производящий действие, затем глагол, и потом объект. К примеру "Мама мыла раму". В русском можно сказать и "Раму мыла мама". Сильно смысл сказанного не потеряется. А вот в английском нельзя просто так поменять местами объект и субъект в предложении. Могут возникнуть проблемы. "Mother is wishing window" или "Window is wishing Mother" Надо все перевести в пассивную форму иначе просто смешно получается. "Рама мыла маму". Английский, немецкий, французский и русский относятся к языкам с типологией порядка слов - SVO (Subject, Verb, Object) .
Собственно человеку воспитанному на таких вот языковых формах свойственно не задумываясь применять их и при программировании.
К примеру при сравнении.
if (state == 2) { console.log("Текущий статус ОТКРЫТО");}
Что переведя на человечий язык звучало бы примерно как "Если статус равен двум, то напиши "Текущий статус ОТКРЫТО"". Один в один, как сказал бы обычный европейский человек.
Проблема в том, что к примеру в языке программировании Си является легитимным написать if(state=2)
. В этом случае переменной state будет присвоено значение 2 и только потом значение переменной state будет приведено к типу boolean и выполнена проверка условия. А так как все, что не ноль считается true, то в любом случае будет напечатано "Текущий статус ОТКРЫТО". То есть сделай программист опечатку и вместо оператора сравнения "==" напишет оператор присвоения "=" программа будет вести себя не так, как это задумывалось и обнаружить такую ошибку бывает очень не просто.
Да, сейчас компайлер может предупредить о подобного рода ошибках, но бывает и предупреждения компайлера просмотришь за кучей других ошибок. Как быть? И вот тут-то и поможет нам учение мастера Йоды.
―Ищу кое-кого.
―Ищешь? Кое-кого нашел ты, а? Хе-хе-хе..
Как уже понятно из цитат, мастер Йода строит свою речь в обратном порядке, непривычном для среднестатистического европейца ― OSV (Объект, субъект, глагол).
Что будет если мы поменяем местами части нашего злосчастного сравнения и вместо if(state=2)
напишем if(2==state)
. Выглядит непривычно и если перевести на человечий язык звучит непривычно. "Если 2 равно статусу". Как известно "от перемены мест слагаемых сумма не меняется" и от перемены мест константы и переменной в операторе сравнения результат не поменяется. Но есть немаловажная деталь. Если случайно вместо оператора сравнения "==" написать оператор присвоения "=", то компайлер не даст скомпилировать программу вообще. Тем более не получится ее запустить. Почему? Потому, что нельзя присвоить константе 2 значение переменной state! Мы спасены. Конечно нелегко привыкнуть писать в обратном порядке, но тем и отличаемся мы, программисты, от обычных маглов. Мы любим думать шиворот на выворот.
Да скажет тот или иной разработчик, - "это уже не актуально и во многих языках программирования это будет считаться ошибкой, в операторе if использовать оператор присвоения, вместо сравнения". Но есть и другие места, где обратная нотация может спасти от нелепых, непредвиденных ошибок.
Возмем к примеру сравнение строк в Java. Как известно в Java для сравнения строк приходится применять оператор equals(). Как среднестатистический европеец запишет сравнение строк? Я нередко встречаю в коде такое и тут же исправляю согласно заветам мастера Йоды. if(State.equals("2")) { System.out.println("Текущий статус ОТКРЫТО");}
. Все замечательно работает, пока в один прекрасный день переменная State не окажется равна null. Допустим кто-то в другом месте забыл инициализировать ее или в базе данных не записали из другого модуля. И что получится? NullPointerExcepton в самый неподходящий момент. Приложение упало, на пол экрана у вас стэктрейс,
все кругом мечутся в панике и с возмущением показывают пальцем на вас, - "он во всем виноват". А вам и возразить то нечем.
И частично они правы. Если бы вы следовали заветам мастера Йоды, то вы, то злосчастное сравнение записали бы в обратном порядке. if("2".equals(Statе)) { System.out.println("Текущий статус ОТКРЫТО");}
. Что бы произошло, если бы переменная State не была бы инициализирована и равна null? Правильно, ничего плохого бы не произошло. Метод equals() вернул бы false и текст бы не был распечатан на экране. И никаких тебе NullPointerException.
Вот так вот, простое следование заветам маленького, зеленого джедая может спасти ваши нервы и время.
―Никаких "почему". На сегодня урок окончен. Очисти ум от вопросов.