Уважаемые пользователи Голос!
Сайт доступен в режиме «чтение» до сентября 2020 года. Операции с токенами Golos, Cyber можно проводить, используя альтернативные клиенты или через эксплорер Cyberway. Подробности здесь: https://golos.io/@goloscore/operacii-s-tokenami-golos-cyber-1594822432061
С уважением, команда “Голос”
GOLOS
RU
EN
UA
ropox
7 лет назад

Мастер Йода, наставник программистов

―Оружие убери! Плохого не сделаю. Знать хочу - зачем ты здесь?

Сидел недавно, бился над проблемой, предотвратить было легко которую, если бы мой коллега применил заветы мастера Йоды.

В русском языке наверное не так очевидно, а во многих европейских языках порядок слов в предложении фиксирован более менее жестко. Сначала идет субъект производящий действие, затем глагол, и потом объект. К примеру "Мама мыла раму". В русском можно сказать и "Раму мыла мама". Сильно смысл сказанного не потеряется. А вот в английском нельзя просто так поменять местами объект и субъект в предложении. Могут возникнуть проблемы. "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.

Вот так вот, простое следование заветам маленького, зеленого джедая может спасти ваши нервы и время.

―Никаких "почему". На сегодня урок окончен. Очисти ум от вопросов.

0
8.649 GOLOS
На Golos с February 2017
Комментарии (3)
Сортировать по:
Сначала старые