ОЧЕНЬ желательно, чтобы функция возвращала какую-то осмысленную ошибку, а не просто завершалась. Ну или выбрасывала исключение. Потому - не очень нормально так делать.
Т.е. Вы искренне считаете, что void функции в С++ использовать некошерно?
А что, если в случае ошибки ф-я должна просто отвалится (сообщение об ошибке скажем выведено уровнем ниже, или его вообще не надо выводить), так не бывает?
Скажем так, решение одной задачи потребовало многократные вываливания из 10 функций, решил узнать как это скажется на программу в целом(производительность и философия).
Кстати ошибки тут на самом деле не ошибки. Исключения не подходят.
ИМХО — абсолютно нормально. Мало того, если функция НЕ должна ничего возвращать, то она НЕ должна ничего возвращать. Если функция должна ЗДЕСЬ закончится, она должна ЗДЕСЬ закончиться, а не прыгать на «точку выхода». Локальные ресурсы должны сами освобождаться, а не вручную. KISS.
можно во втором if (!object1.error && !object2.error)
и зачем нужен лишний оверхэд? Лишняя проверка только нарушает читабельность, а иногда может и сильно затормозить. Я уж не говорю о том, что не всегда ошибку можно проверить дважды. Если мы не смогли прочитать первый байт, то глупо проверять, смогли-ли мы прочитать первый байт после чтения первого, для чтения второго. Да и если не смогли, то непонятно, какой именно байт мы не смогли прочитать.
то КУДА ты засунешь свой код ошибки? Методы либо вообще ничего не возвращают, либо возвращают что-то нужное, как например здесь object_b::operator*(const object_c &) const;
Если произошла ошибка, то либо object должен перейти в особое состояние, и программа будет ковылять дальше, либо, если ошибка фатальна, должно быть исключение.
Скажем так, решение одной задачи потребовало многократные вываливания из 10 функций, решил узнать как это скажется на программу в целом(производительность и философия).
попробуй ввести костыли, и узнаешь сам. Хотя, лично мне и так очевидно, что с костылями код будет тормозить и глючить. Да и поддерживать его будет сложнее.
Гото - раз. Табличка переходов/свич - два. Запихни это дальше, аля:
make_next_1() {
if(error)
return;
}
Ну и основа всего, зачем вы лалки решаете проблему сверху? Вылезла у тебя какаха после 1к строк кода - значит ты где-то зафейлил выше, но нет же - ты будешь решать псевдопроблему, которая тебе сейчас мешает.
Зачем храниешь error, что это тебе даёт? Спегети? Вылезла ошибка - юзай гото, либо прыгай на обработчик ошибки( не гото, а функцией, если у тебя есть предрассудки по поводу гото и ты слишком анскилен, чтобы его юзать) - делай что надо с этой обишибкой и возвращай на состояние до ошибки.
Но один фиг - всё это фикция, я не знаю почему у тебя произошел такой фейл, что тебе больше подойдёт, какого типа у тебя код и т.п.
И да, то, что говорят эти анскильные создания по помоду гото, ретурна - это просто фейспалм, ибо когда я читаю код он должен быть: а) максимально компактен, б) минимум избыточен и красив.
Я не абделён мозгом, чтобы осилить гото и ретурн. Зачем юзать ЯП, если ты не осилил его синтаксис? Скобочки для ифа с телом в один лайн юзают лалки, нету != 0 - радует.
Приводи более широкий пример, чтобы пацаны видели из чего растут ноги, а не факт того, что ноги кривые.
Нынешняя мода целиком навязана и усиленно продвигается «корпоративными стандартами», т.е. способом нанять армию дебилов и сделать так, чтобы они могли догадаться о чем собственно код. Неудивительно, что свежая кровь повсеместно с этим сталкивается. Кстати мода эта меняется со временем, каждые пять лет меняются вопросы «нормально ли», и каждый раз я под столом от модных ответов. Старая школа — всегда срали на эти «стандарты» и впредь будем продолжать эту добрую традицию, не переживай.
dron@gnu:~$ gcc ./test.c --std=c99 -Wall -pedantic
dron@gnu:~$ gcc ./test.c --std=c11 -Wall -pedantic
dron@gnu:~$ gcc ./test.c --std=c89 -Wall -pedantic
./test.c: In function ‘main’:
./test.c:21:1: warning: control reaches end of non-void function [-Wreturn-type]
dron@gnu:~$
Если верить этому то сейчас(с99,с11) выходить return`ом в произвольном месте нормально, а вот раньше наверное подразумевалось не писать void функций которые не отрабатывают полностью или оперировать if`ами, исключениями.
да. В данном случае идёт вычисление выражения (логического), а я говорил о логике работы программы. Это разные вещи. В данном случае, логика работы простая, там всего два выражения, и всё.
./test.c:21:1: warning: control reaches end of non-void function [-Wreturn-type] раньше наверное подразумевалось не писать void функций которые не отрабатывают
Смысл сообщения от тебя ловко ускользнул, и немудрено, с таким-то выводом.
Ущербанский стал, ущебанское неосиляторство !ok, ущербанское api у CURLRaii. Ущербнаская бессмысленная недопроверка. Как у тебя не сработать setOption()? Кастыль, ибо не осилили assert()?
Как я люблю эту вермешельку, вроде типа красивую, в обёрточке, всё ровненько, а откроешь обёрточку - говно говном.
тут (в первом посте) скорее Pure C, а не C++. В нём да, проблема будет с ресурсами, и с освобождением тех объектов, которые ещё не доделаны. В этом случае лучше и удобнее иметь одну точку выхода. Ну а в C++ удобнее другой подход, когда ресурсы освобождаются автоматически. И потому на ошибку можно реагировать когда надо, а не внезапно.
Зачем мне показывать что-то, если я могу доказать, что а) ты анскилен( уже 10раз доказано) и б) я могу доказать, что код какаха, причем достаточно объективно.
Я объяснил объективные причины - тебе их мало? Теперь я жду твоих контраргументов и объяснений почему код хорош.
Не тебе: Да простит меня модератор - я даже не понял, как нписал это ужасное слово, а редактировать не могу.
Зачем мне показывать что-то, если я могу доказать, что а) ты анскилен( уже 10раз доказано) и б) я могу доказать, что код какаха, причем достаточно объективно.
а) это ничего не доказывает.
б) обосрать может каждый. Даже тот, кто совершенно не понимает того, на что срёт. Мало того, тот, кто понимает, срать скорее всего не станет, разве что у него есть тоже самое, но намного лучше. Откуда вывод:
1. ты либо не понимаешь,
2. либо у тебя есть что-то лучше.
Т.к. второе по твоим словам ложно, то очевидно, что ты не в теме.
Я объяснил объективные причины - тебе их мало? Теперь я жду твоих контраргументов и объяснений почему код хорош.
нет, ты просто всё обосрал. Какие тут могут быть аргументы, кроме как насрать на твой код?
есть, но не нужно их применять бездумно. Вот тебе пример: ты пишешь в СУБД, и не получается. Вот тут исключения применять НЕ надо. Может кто-то другой тоже пишет, и это вполне нормальная ситуация, надо просто чутка подождать. Исключения нужно бросать лишь в случае фатальных ошибок, а не просто так. Они(исключения) слишком дорогие.