Использование goto
*перенес из ветки обсуждения компании Самсунг*
JBM
Самсунг порадовал. Сползли под столы всем офисом.
Коротенькая вводная:
Наверное ни для уже кого не секрет, что Самсунг наваял свою операционку Bada и собирается выпускать на ней смартфоны. Также, полагаю уже не секрет, что их киевский R& D принимал непосредственное участие в её разработке.
А порадовал Самсунг вот чем: Официальная документация по Баде
нотариально заверенный скриншот № 1: s005.radikal.ru/.../1007/01/33089f00fcb6.png
Сначала я поперхнулся чаем увидев goto в С++ коде. Но это ладно — на самом деле если использовать goto аккуратно и грамотно, то проблем можно избежать. Мы ведь знаем что в Самсунг набирали только лучших из лучших, поэтому им это по плечу. Но зачем давать такие опасные вещи в официальной документации? Ведь неизвестно кто будет писать код по таким докам, далеко не всегда это будут профессионалы.
Обратите внимание на два goto в красных квадратиках. В случае ошибки будет переход на CATCH, однако возвращаемое значение E_SUCCESS. Бага в официальном примере. Блин, ребята, ну это же позорище...
нотариально заверенный скриншот № 2: s45.radikal.ru/.../1007/2a/e28852e199a5.png
А вот этот goto гораздо зачетнее. В плюсах категорически запрещено с помощью goto выходить из блока. В результате такого выхода будет пропущено удаление объектов созданных (в том числе неявно) при входе в блок. И хотя в данном конкретном примере утечек вроде бы нет, такая практика крайне порочна. Даже если сейчас в блоке нет создания объектов, то по закону Мерфи их кто-нибудь обязательно добавит позже.
В общем, вот линк, там этого фана навалом. dpimg.ospos.net/...ce.help/FramesetMain.html menu=MC01010200& mtb1=& mtb2=
И это сделано руками тех людей, которые год назад на собеседованиях кидали неистовые понты, чмыря и топча кандидатов за мелчайшие ошибки. А на поверку сами оказались горе-кодерами. Время расставило всё по местам. Так-то!
—
bill_gates
2JBM:
не стоит выствлять свой опыт и знания на показ.
1. там вполне легальный стиль использования goto, такое по коду связаному с девайсами встречается часто.
2. во всех доках что я встречал в качестве примеров демонтсрируется только то что надо, и забивается болт на обзвязку в виде проверки параметров/обработки ошибок.
А вот этот goto гораздо зачетнее. В плюсах категорически запрещено с помощью goto выходить из блока. В результате такого выхода будет пропущено удаление объектов созданных (в том числе неявно) при входе в блок.
может обьясниш где ты нашел категорисеский запрет на такое? вот маленкий пример:
Examples of good gotos in C or C++
stackoverflow.com/...s-of-good-gotos-in-c-or-c
—
realist
2 JBM
Использование goto, как частный случай с переходом на единственную точку выхода это прием известный. Некоторое пояснение:
kerneltrap.org/node/553/2131
www.xml.com/...ter/book/ch02.html#buierr
Время действительно расставило все по местам — чморили не напрасно.
—
JBM
2 bill_gates, realist
Как я уже написал, я не страдаю goto-фобией, это ламерское. Я наоборот говорю что грамотное и аккуратное использование goto позволяет избежать проблем. Однако не надо путать чистый С и С++. Примеры, приведенные по ссылкам, относятся к чистым сям и там нет никаких проблем с goto. Однако, в С++ проблемы появляются очень легко. Простейший пример:
Вариант 1:
Container cont;
cont.put (item1);
cont.put (item2);
goto EXIT;
...
EXIT:
return;
Вариант 2:
{
Container cont;
cont.put (item1);
cont.put (item2);
goto EXIT;
}
...
EXIT:
return;
Разницу улавливаете?
—
JBM
Ну и если уж на то пошло, то даже для чистого С их goto неправильный. Сравните и попытайтесь понять разницу:
Самсунг’s ноу-хау:
RES foo () {
RES result = SUCCESS;
....
....
return result;
CATCH:
/* do cleanup */
return result;
}
Правильно:
RES bar () {
RES result = FAIL;
....
....
return SUCCESS;
CATCH:
/* do cleanup */
return result;
}
56 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів