- 1
- 2
- 3
- 4
- 5
- 6
label t1:
if(something) {
} else {
goto t1;
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
−23
label t1:
if(something) {
} else {
goto t1;
}
Возвращение назад после провала, и так до бесконечности.... Примерно такой код за который вас забанят почти везде! Не повторяйте чужих ошибок, в то так ардуина сдохнет. Был такой случай, заела и все!
ASD_77 03.04.2017 14:05 # −1
acterhd 03.04.2017 14:09 # −1
grammar-nazi 03.04.2017 14:18 # +7
grammar-nazi 03.04.2017 14:19 # +7
inkanus-gray 03.04.2017 14:28 # +2
roman-kashitsyn 03.04.2017 14:27 # +6
В сишечке goto — необходимое зло, единственный удобный способ освобождения нескольких ресурсов.
ASD_77 03.04.2017 14:35 # −4
roman-kashitsyn 03.04.2017 14:37 # +3
ASD_77 03.04.2017 14:40 # −1
roman-kashitsyn 03.04.2017 14:57 # +2
Dummy00001 03.04.2017 15:37 # 0
goto убить никогда не получится - в особенности в системщине - потому что так процы работают. если знаешь как оно просто может быть в объектном коде - то писать горбатый код уже просто руки не подымаются. тем учитывая что горбатый код на порядки сложнее править и поддерживать.
roman-kashitsyn 03.04.2017 15:56 # +1
Ну у тебя "деструкторы" сложно заанроллены, здесь я не вижу особого смысла это делать. Со временем я пришёл к выводу, что гораздо проще писать "деструкторы", которые являются NOOP в случае, когда ресурс не был проинициализирован, как free(NULL). Тогда стек меток либо вообще не нужен, либо гораздо меньше, и функция гораздо проще для понимания.
Dummy00001 03.04.2017 16:13 # 0
от приложения, к приложению.
на системщине это часто и секурити и производительность: ничего лишнего в пустую не делать.
roman-kashitsyn 03.04.2017 16:18 # 0
Я бы сказал, что на фоне открытия файла/выделения памяти пара дополнительных сравнений указателей в случае, который почти никогда не происходит — это копейки в 95% случаев.
Dummy00001 03.04.2017 17:03 # 0
но в прикладном коде, да, 95% времени это не нужно.
ASD_77 03.04.2017 16:22 # −4
Настоятельно рекомендую юзать LIBUNWIND
roman-kashitsyn 03.04.2017 16:28 # +5
Или исходишь из принципа "главное, чтобы не было goto, а то я где-то слышал, что он harmful"?
Понятно, что без goto можно переписать, просто от этого код становится хуже для понимания. В твоём случае он превратился в двумерный косяк птиц, которые летят на юг.
ASD_77 03.04.2017 16:30 # −4
для справки
http://www.planetgeek.ch/wp-content/uploads/2014/11/Clean-Code-V2.4.pdf
roman-kashitsyn 03.04.2017 16:36 # +8
Ок, я так и думал.
ASD_77 03.04.2017 16:42 # −3
Точно думаешь я не знаю "значимость производства или коммерции" :)?
roman-kashitsyn 03.04.2017 16:53 # +6
К слову, в той pdf-ке, которую ты привёл, слово goto вообще не встречается. Да и рассчитана она явно на ООП-языки, где есть альтернативные способы освобождения ресурсов, а не на сишку.
Dummy00001 03.04.2017 17:07 # 0
http://ricardogeek.com/docs/clean_code.pdf
ASD_77 03.04.2017 17:11 # −5
ну или хотябы бейсик try/catch аналог
CHayT 03.04.2017 17:17 # +3
roman-kashitsyn 03.04.2017 17:22 # +8
Отряхивается, подымает взгляд обратно на вершину спуска говорит: "Б.дь.! Все равно лучше, чем GOTO!"
ASD_77 03.04.2017 17:24 # −6
ASD_77 03.04.2017 17:37 # −4
Bopmand 05.04.2017 13:24 # 0
Для этого миксер вроде юзают. причем давно уже.
Holly_Shit 03.04.2017 18:45 # 0
CHayT 03.04.2017 17:04 # +7
-- Помогите, меня грабят!
-- Человек-дейкстра спешит на помощь! Goto considered harmful, до свидания.
Dummy00001 03.04.2017 17:05 # +3
> конечно он лучше. Он как минимум удовлетворяет требованиям "Clean code"
"в жопу людей которые с этим кодом работают - давайте лучше послушаем мнение случайных людей с интернета."
roman-kashitsyn 03.04.2017 17:17 # +6
А, так его так назвали потому, что он выглядит как клин уток, летящих на юг?
Dummy00001 03.04.2017 18:09 # 0
нет, на север. это же суицидальные утки.
ASD_77 03.04.2017 16:32 # −1
ненравятся "птицы" юзай libunwind или аналоги для error хандлинга
CHayT 03.04.2017 20:33 # 0
Срочно проведите над Романом экзорцизм -- он опять по стенам ходит!
roman-kashitsyn 03.04.2017 21:22 # +6
Так ты разверни стол вокруг своей оси, сверяясь по компасу.
Antervis 03.04.2017 17:03 # +6
Даже после каждого if выделять память и делать early return лучше
Antervis 03.04.2017 17:04 # 0
ASD_77 03.04.2017 17:16 # 0
ASD_77 03.04.2017 17:40 # −1
gost 04.04.2017 00:08 # +2
3.14159265 01.09.2021 04:00 # 0
Фактически программирование с блоком. Прыгнуть можно только в его конец. Возможности наговнять лапши уменьшаются.
С goto можно прыгать куда угодно — он так явно не отделяет скоуп работы от скоупа освобожения ресурсов.
ECEHuHCKuu_nemyx 19.10.2020 00:14 # 0
1024-- 03.04.2017 17:29 # +3
Antervis 03.04.2017 15:56 # 0
а если тут память кончится?
Зачем free(0)?
я бы, кстати, не разделял освобождение ресурсов позитивного и негативного сценариев.
roman-kashitsyn 03.04.2017 16:00 # 0
Да, пропустил. Мысленно добавляем if (!*out) { code = NO_MEM; goto fail; }
> не разделял освобождение ресурсов позитивного и негативного сценариев.
Спорный вопрос, так легко превратить функцию в нечитаемую непонятную лапшу из переходов.
> Зачем free(0)?
http://govnokod.ru/22731#comment380554
Antervis 03.04.2017 17:06 # 0
За это и люблю плюсы. Кстати, а если так?: http://ideone.com/CyNoSl
ASD_77 03.04.2017 17:14 # −1
Antervis 03.04.2017 17:27 # +4
roman-kashitsyn 03.04.2017 17:15 # +2
Так это же изоморфно гошному defer :)
Только делитеры нужно вызывать в обратном порядке, а не в прямом, иначе будет беда.
Ещё похоже, что нужно два стека делитеров: на временные объекты, которые удаляются в любом случае, и на "постоянные", которые покидают скоп функции транзакционно.
Antervis 03.04.2017 17:27 # 0
Antervis 03.04.2017 17:16 # 0
bormand 03.04.2017 18:50 # +3
Иногда, после позитивного сценария, часть этих ресурсов вообще должна остаться в живых - их вернут, пристегнут к к какой-то структуре и т.п. Так что не всегда можно смешать.
bormand 03.04.2017 19:03 # +1
> return code; // после очистки ресурсов при ошибке
Опасный паттерн, можно случайно вернуть успех:
http://govnokod.ru/14935
З.Ы. Хотя, конечно, они там просто с однострочниками довыябывались.
roman-kashitsyn 03.04.2017 19:08 # 0
bormand 03.04.2017 19:17 # +1
bormand 03.04.2017 19:37 # −3
Обработка ошибок в си - боль.
inhoguest 03.04.2017 19:50 # +7
[картинка с негром здесь]
bornyand 18.07.2021 10:13 # 0
bootcamp_dropout 18.07.2021 10:10 # 0
И потом вызывать его и сразу делать return? И говнопереназначений code не было бы, можно сразу возвращать литерал
PolinaAksenova 18.07.2021 11:09 # +3
bootcamp_dropout 18.07.2021 11:20 # 0
bormand 18.07.2021 11:33 # +1
JloJle4Ka 18.07.2021 11:37 # 0
Так и до метатаблиц недалеко...
bootcamp_dropout 18.07.2021 11:46 # +1
я понимаю что байтоебы удавятся за три байта при том что открывают файл в том же месте, но давайте смотреть на вещи объективно
goto:
- низкий cohesity. Ты определяешь какую-то брухлю из освобождений посреди функции, у тебя может быть спереди код, сзади код, от goto 100 строк и ты как опездол бегаешь по функции чтобы что-то понять
- Ты перед тем как в эту брухлю что-то добавить должен пройтись по всем меткам (сверху энтузиасты goto "улучшили" код до 6 меток)
- Происходит какой-то мутный ассайн кода перед переходом а если не сделаешь то обосрешься или говно вернешь
- хуевая расширяемость. Если ты вдруг решишь что после очистки ресурсов можно зарекавериться то что, goto обратно напишешь?
функция с аргументами или структурой:
- чуть больше кода на структуру или педерачу аргументов
- оверхед на вызов функции
- Высокая cohesity. Обосрался, сразу вызвал функцию, сразу сделал return
- Нет проблем с реассайном. Сразу делаешь return FS_ERR, риск обосраться 0 процентов
- Гораздо лучше масштабируется. Если увелится кол-во кода, можно еще что-то добавить в функцию, скомпозировать функции или сделать новые. Фанаты гото конечно же сейчас просрутся 20 метками и расскажут как им охуенно
Desktop 18.07.2021 11:48 # +1
bootcamp_dropout 18.07.2021 11:49 # 0
guest6 18.07.2021 11:49 # +2
Desktop 18.07.2021 11:49 # +1
bootcamp_dropout 18.07.2021 11:55 # +1
gologub 18.07.2021 11:57 # 0
3.14159265 01.09.2021 03:32 # 0
Заминусили пацана ни за что.
Идиоматичнее конечно: Но по факту можно и так прыгать в конец, без goto.
cykablyad 03.04.2017 22:02 # +2
Даже иногда в сишарпике
Ни о чем не жалею
bormand 03.04.2017 22:03 # +2
cykablyad 03.04.2017 22:06 # +7
Ключи от дома, например. Или от говнокода
dxd 04.04.2017 17:08 # 0
cykablyad 04.04.2017 17:35 # 0
guest 04.04.2017 14:04 # −3
bormand 04.04.2017 19:28 # 0
barop 05.04.2017 09:58 # 0
Проверь
bagrinho 18.07.2021 12:08 # 0
JloJle4Ka 18.07.2021 12:17 # +2
А какая разница, один он или его много? Борманд в России и в мире, это уже давно не человек. Борманд, это миф. Он не то, что представляет из себя на самом деле, это то, что создала целенаправленная пропаганда, СМИ, всевозможные имиджмейкеры. Он не то, что он есть, он то, что в нем хотят видеть. Он иллюзия, мираж миллионов.
bormand 18.07.2021 12:41 # +6
Настоящий борманд няпокашнулся ещё в 2017 году, с того момента мы общались с клонами борманда. Они разного роста, разным цветом волос на аватарке, с разными пропорциями ушек, с разными голосами. Один умеет писать на С++, другой указательным пальцем с ошибками играет в осу, третий говнокодит под контроллеры. Но все они почему-то забыли паскаль, все разного возраста, иногда даже доходит до того, что в тредах на ГК лежат рядом разные комменты с разными бормандами ))) Вот такой сайт, вот такая анонимность.
bornyand 18.07.2021 12:45 # +3
Подтвярждяю ówò
Desktop 18.07.2021 12:58 # +3
GravatarGovno 19.07.2021 10:24 # +1
bagrinho 18.07.2021 12:07 # 0
CHayT 03.04.2017 20:45 # +1
EINTR, кстати, примерно так и обрабатывают.