- 1
- 2
- 3
- 4
- 5
- 6
label t1:
if(something) {
} else {
goto t1;
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
−23
label t1:
if(something) {
} else {
goto t1;
}
Возвращение назад после провала, и так до бесконечности.... Примерно такой код за который вас забанят почти везде! Не повторяйте чужих ошибок, в то так ардуина сдохнет. Был такой случай, заела и все!
В сишечке goto — необходимое зло, единственный удобный способ освобождения нескольких ресурсов.
goto убить никогда не получится - в особенности в системщине - потому что так процы работают. если знаешь как оно просто может быть в объектном коде - то писать горбатый код уже просто руки не подымаются. тем учитывая что горбатый код на порядки сложнее править и поддерживать.
Ну у тебя "деструкторы" сложно заанроллены, здесь я не вижу особого смысла это делать. Со временем я пришёл к выводу, что гораздо проще писать "деструкторы", которые являются NOOP в случае, когда ресурс не был проинициализирован, как free(NULL). Тогда стек меток либо вообще не нужен, либо гораздо меньше, и функция гораздо проще для понимания.
от приложения, к приложению.
на системщине это часто и секурити и производительность: ничего лишнего в пустую не делать.
Я бы сказал, что на фоне открытия файла/выделения памяти пара дополнительных сравнений указателей в случае, который почти никогда не происходит — это копейки в 95% случаев.
но в прикладном коде, да, 95% времени это не нужно.
Настоятельно рекомендую юзать LIBUNWIND
Или исходишь из принципа "главное, чтобы не было goto, а то я где-то слышал, что он harmful"?
Понятно, что без goto можно переписать, просто от этого код становится хуже для понимания. В твоём случае он превратился в двумерный косяк птиц, которые летят на юг.
для справки
http://www.planetgeek.ch/wp-content/uploads/2014/11/Clean-Code-V2.4.pdf
Ок, я так и думал.
Точно думаешь я не знаю "значимость производства или коммерции" :)?
К слову, в той pdf-ке, которую ты привёл, слово goto вообще не встречается. Да и рассчитана она явно на ООП-языки, где есть альтернативные способы освобождения ресурсов, а не на сишку.
http://ricardogeek.com/docs/clean_code.pdf
ну или хотябы бейсик try/catch аналог
Отряхивается, подымает взгляд обратно на вершину спуска говорит: "Б.дь.! Все равно лучше, чем GOTO!"
Для этого миксер вроде юзают. причем давно уже.
-- Помогите, меня грабят!
-- Человек-дейкстра спешит на помощь! Goto considered harmful, до свидания.
> конечно он лучше. Он как минимум удовлетворяет требованиям "Clean code"
"в жопу людей которые с этим кодом работают - давайте лучше послушаем мнение случайных людей с интернета."
А, так его так назвали потому, что он выглядит как клин уток, летящих на юг?
нет, на север. это же суицидальные утки.
ненравятся "птицы" юзай libunwind или аналоги для error хандлинга
Срочно проведите над Романом экзорцизм -- он опять по стенам ходит!
Так ты разверни стол вокруг своей оси, сверяясь по компасу.
Даже после каждого if выделять память и делать early return лучше
Фактически программирование с блоком. Прыгнуть можно только в его конец. Возможности наговнять лапши уменьшаются.
С goto можно прыгать куда угодно — он так явно не отделяет скоуп работы от скоупа освобожения ресурсов.
а если тут память кончится?
Зачем free(0)?
я бы, кстати, не разделял освобождение ресурсов позитивного и негативного сценариев.
Да, пропустил. Мысленно добавляем if (!*out) { code = NO_MEM; goto fail; }
> не разделял освобождение ресурсов позитивного и негативного сценариев.
Спорный вопрос, так легко превратить функцию в нечитаемую непонятную лапшу из переходов.
> Зачем free(0)?
http://govnokod.ru/22731#comment380554
За это и люблю плюсы. Кстати, а если так?: http://ideone.com/CyNoSl
Так это же изоморфно гошному defer :)
Только делитеры нужно вызывать в обратном порядке, а не в прямом, иначе будет беда.
Ещё похоже, что нужно два стека делитеров: на временные объекты, которые удаляются в любом случае, и на "постоянные", которые покидают скоп функции транзакционно.
Иногда, после позитивного сценария, часть этих ресурсов вообще должна остаться в живых - их вернут, пристегнут к к какой-то структуре и т.п. Так что не всегда можно смешать.
> return code; // после очистки ресурсов при ошибке
Опасный паттерн, можно случайно вернуть успех:
http://govnokod.ru/14935
З.Ы. Хотя, конечно, они там просто с однострочниками довыябывались.
Обработка ошибок в си - боль.
[картинка с негром здесь]
И потом вызывать его и сразу делать return? И говнопереназначений code не было бы, можно сразу возвращать литерал
Так и до метатаблиц недалеко...
я понимаю что байтоебы удавятся за три байта при том что открывают файл в том же месте, но давайте смотреть на вещи объективно
goto:
- низкий cohesity. Ты определяешь какую-то брухлю из освобождений посреди функции, у тебя может быть спереди код, сзади код, от goto 100 строк и ты как опездол бегаешь по функции чтобы что-то понять
- Ты перед тем как в эту брухлю что-то добавить должен пройтись по всем меткам (сверху энтузиасты goto "улучшили" код до 6 меток)
- Происходит какой-то мутный ассайн кода перед переходом а если не сделаешь то обосрешься или говно вернешь
- хуевая расширяемость. Если ты вдруг решишь что после очистки ресурсов можно зарекавериться то что, goto обратно напишешь?
функция с аргументами или структурой:
- чуть больше кода на структуру или педерачу аргументов
- оверхед на вызов функции
- Высокая cohesity. Обосрался, сразу вызвал функцию, сразу сделал return
- Нет проблем с реассайном. Сразу делаешь return FS_ERR, риск обосраться 0 процентов
- Гораздо лучше масштабируется. Если увелится кол-во кода, можно еще что-то добавить в функцию, скомпозировать функции или сделать новые. Фанаты гото конечно же сейчас просрутся 20 метками и расскажут как им охуенно
Заминусили пацана ни за что.
Идиоматичнее конечно: Но по факту можно и так прыгать в конец, без goto.
Даже иногда в сишарпике
Ни о чем не жалею
Ключи от дома, например. Или от говнокода
Проверь
А какая разница, один он или его много? Борманд в России и в мире, это уже давно не человек. Борманд, это миф. Он не то, что представляет из себя на самом деле, это то, что создала целенаправленная пропаганда, СМИ, всевозможные имиджмейкеры. Он не то, что он есть, он то, что в нем хотят видеть. Он иллюзия, мираж миллионов.
Настоящий борманд няпокашнулся ещё в 2017 году, с того момента мы общались с клонами борманда. Они разного роста, разным цветом волос на аватарке, с разными пропорциями ушек, с разными голосами. Один умеет писать на С++, другой указательным пальцем с ошибками играет в осу, третий говнокодит под контроллеры. Но все они почему-то забыли паскаль, все разного возраста, иногда даже доходит до того, что в тредах на ГК лежат рядом разные комменты с разными бормандами ))) Вот такой сайт, вот такая анонимность.
Подтвярждяю ówò
EINTR, кстати, примерно так и обрабатывают.