Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.22.77.149] |
|
Страницы: (32) « Первая ... 18 19 [20] 21 22 ... 31 32 ( Перейти к последнему сообщению ) |
Сообщ.
#286
,
|
|
|
Цитата JoeUser @ Давай начинай мне советовать эту портянку с линейным выполнением переписать в 9 классов! Где 9? Я тут только три вижу, по количеству cleanup-ов. И в чём сложость? Классы эти всего лишь raii обёрткой будут, вообще ни о чём. Но вообще в целом да, если ты пишешь программу из 100 строк, то выносить в ней освобождение ресурсов в raii если ты юзаешь сишное api смысла действительно не сильно много. А он есть. Как минимум это устойчивость программы к неожиданным исключениями и ошибкам в последующих изменениях. |
Сообщ.
#287
,
|
|
|
Цитата OpenGL @ А он есть. Как минимум это устойчивость программы к неожиданным исключениями и ошибкам в последующих изменениях. Только не здесь! Дело в том, что я ее пилю под API Qt5, а тамошние прогеры не жалуют исключения, более того - советуют про них вааще забыть, если используется Qt. Ну с ними конечно не очень согласен, |
Сообщ.
#288
,
|
|
|
Это всё не отменяет остальное. Ок, исключения ты не юзаешь, но все эти многочисленные goto cleanup в разы более подвержены ошибкам и в разы менее устойчивы, чем нормальное решение.
Хотя я это уже не раз объяснял, причём даже тебе. Если ты до сих пор задаёшься вопросом, зачем это надо, то смысла вдаваться в подробности не очень много. |
Сообщ.
#289
,
|
|
|
Цитата OpenGL @ в разы менее устойчивы, чем нормальное решение OpenGL, че мы будем переливать из пустого в порожнее? Типа "там это вам не тут". Давай на примере покажи! Вот тебе кусок подобного кода, Всего 49 строк. Трансформируй его, как ты считаешь правильным, и мы вместе с тобой посмотрим? // lv = local value // cv = class value // r1 .. r3 - захватываемые ресурсы lv = init1(r1); if (lv!=0) { err = "err-1"; goto cleanup1; } cv1 = init2(r2); if (cv1!=0) { err = "err-2"; goto cleanup3; } lv = init3(); if (lv!=0) { cv1 = -1; err = "err-3"; goto cleanup2; } cv2 = init4(); if (cv2!=0) { err = "err-4"; goto cleanup2; } lv = init5(); if (lv!=0) { err = "err-5"; goto cleanup3; } lv = init6(r3); if (lv!=0) { err = "err-6"; goto cleanup4; } .... .... .... return; cleanup4: release3(r3); cleanup3: cv1 = 0; cv2 = 0; cleanup2: release2(r2); cleanup1: release1(r1); |
Сообщ.
#290
,
|
|
|
Зачем мне как-то трансформировать код, который ты только что придумал специально так, чтобы его было удобно писать именно с goto? Он не подобен, т.к. у тебя тут goto cleanup%random% идёт. На практике же такое не встречается, и, в частности, твой оригинальный код прекрасно разруливается через деструкторы.
Добавлено Да и вообще - что ты доказываешь? Если то, что goto иногда полезен, то я с этим тезисом скорее согласен, однако твой код это не доказывает. |
Сообщ.
#291
,
|
|
|
Цитата OpenGL @ Зачем мне как-то трансформировать код, который ты только что придумал специально так, чтобы его было удобно писать именно с goto? Он не подобен, т.к. у тебя тут goto cleanup%random% идёт. На практике же такое не встречается, и, в частности, твой оригинальный код прекрасно разруливается через деструкторы. Добавлено 3 минуты назад Да и вообще - что ты доказываешь? Если то, что goto иногда полезен, то я с этим тезисом скорее согласен, однако твой код это не доказывает. Ответ на пять! 49 совершенно неправильных строчек - лишили меня дозы адреналина А он, окаянный, так благодатно выделяется как раз в моменты, когда тебя такого самоуверенного тыкают носом в невиданной красоты код. А тут ... опять облом. И уже стандартная аргументация - "никогда такого не было - и вот опять!" (С) Добавлено Цитата OpenGL @ однако твой код это не доказывает Ну покажи как правильно на моем коде! И моя благодарность будет безгранична в разумных пределах. |
Сообщ.
#292
,
|
|
|
Цитата JoeUser @ Ну покажи как правильно на моем коде! У тебя естественным образом выделяются 3 ресурса, и их освобождение привязано к трём меткам. Сделай создание соответствующих обёрток над ними в нужные моменты (хоть объяви типы руками, хоть так, как Киля показал - пофиг), в моменты, когда что-то идёт не так, делай просто return. А когда ты дошёл до самого конца, просто делай std::move этих ресурсов в поле своего класса. |
Сообщ.
#293
,
|
|
|
OpenGL, не нужно слов - покажи кодом! Я же все выложил - для копипасты нет пределов. Мне просто хочется тупо сравнить мое говтушное , и твое красивое. Сразу предупреждаю - отмазы типа "мне лень" воспринимаются как трамвайный съезд. Как говорят "сказал А - говори и Бэ". Мне нужно сравнить два кода, мой говнявый, и твой эталонный. Не будет кода - разговор закончен, ибо пока это - вода.
Скрытый текст Напомню - у нас сайт называется "исходники" а не "водолеи" |
Сообщ.
#294
,
|
|
|
JoeUser, нормальные посоны написали бы так (если прям нужно без исключений):
error* init(R1& r1, R2& r2, R3& r3) { LV lv; lv = init1(&r1); if (lv != 0) { return "err-1"; } cv1 = init2(&r2); if (cv1 != 0) { return "err-2"; } lv = init3(); if (lv != 0) { cv1 = -1; return "err-3"; } cv2 = init4(); if (cv2 != 0) { return "err-4"; } lv = init5(); if (lv != 0) { return "err-5"; } lv = init6(&r3); if (lv != 0) { return "err-6"; } return null; } error* init() { R1 r1; R2 r2; R3 r3; error* err = init(&r1, &r2, &r3); if (err != null) { cv1 = 0; cv2 = 0; return err; } ... ... ... return null; } |
Сообщ.
#295
,
|
|
|
Цитата JoeUser @ OpenGL, че мы будем переливать из пустого в порожнее? Типа "там это вам не тут". Давай на примере покажи! Вот тебе кусок подобного кода, Всего 49 строк. Трансформируй его, как ты считаешь правильным, и мы вместе с тобой посмотрим? Если функции которые используются в этом говнокоде реально делают полезную работу, например там - открывают файлы, выделяют память, устанавливают соединие и т.п. То в принципе в этом говнокоде как минимум 3 утечки. Если же они просто возвращают какие то переменные на стеке, то их уничтожать смысла нет. ЗЫЖ lv = init1(r1); //! <<<<<<<<<<<<<<<<<<< Выделили память в куче, открыли файл, установили соединение, и т.д. if (lv!=0) { err = "err-1"; goto cleanup1; } cv1 = init2(r2); if (cv1!=0) { err = "err-2"; goto cleanup3; } lv = init3(); //! <<<<<<<<<<<<<<<<<<<<< плевать что перед этим мы завладели ресурсом, в этом месте мы теряем ранее захваченный ресурс. Ну и т.д. по коду. Ну а если ты всего лишь опечатался и там другие имена переменных, то этот говнокод вполдне себе переписывается в нормальный, качественный код: https://ideone.com/WMrtkA #include <iostream> #include <memory> void SomeFunc() { auto r1_cleanup = [](int* ptr){ std::cout << "r1_cleanup is called" << std::endl; }; auto r2_cleanup = [](int* ptr){ std::cout << "r2_cleanup is called" << std::endl; }; auto r3_cleanup = [](int* ptr){ std::cout << "r3_cleanup is called" << std::endl; }; auto lv = std::unique_ptr<int, decltype(r1_cleanup)>(new int()/*::init1(...)*/, r1_cleanup); auto cv1 = std::unique_ptr<int, decltype(r2_cleanup)>(new int()/*::init2(...)*/, r2_cleanup); auto cv2 = std::unique_ptr<int, decltype(r3_cleanup)>(new int()/*::init3(...)*/, r3_cleanup); /*...*/ } int main() { SomeFunc(); return 0; } |
Сообщ.
#296
,
|
|
|
Цитата korvin @ (если прям нужно без исключений) Неа ... Скрытый текст error* init(R1& r1, R2& r2, R3& r3) { LV lv; lv = init1(&r1); if (lv != 0) { return "err-1"; } cv1 = init2(&r2); if (cv1 != 0) { return "err-2"; } lv = init3(); if (lv != 0) { ◄─── тут случился облом, нужно освободить r1, r2, а cv1=-1, ─┐ cv1 = -1; │ return "err-3"; │ } │ cv2 = init4(); │ if (cv2 != 0) { │ return "err-4"; │ } │ lv = init5(); │ if (lv != 0) { │ return "err-5"; │ } │ lv = init6(&r3); │ if (lv != 0) { │ return "err-6"; │ } │ return null; │ } │ │ error* init() │ { │ R1 r1; │ R2 r2; │ R3 r3; │ │ error* err = init(&r1, &r2, &r3); │ if (err != null) { │ cv1 = 0; ◄───── а ты? ────────────────────────────────────────────────┘ cv2 = 0; return err; } ... ... ... return null; } Добавлено Цитата Wound @ Выделили память в куче, С хера ли "выделили"??? Функция вернула указатель в мою стековую переменную на данные из своих "недр". Цитата Wound @ плевать что перед этим мы завладели ресурсом, в этом месте мы теряем ранее захваченный ресурс. Lv - не указатель, а флаг успешности/неуспешности отработки функции Init<номер>. Вааще не теряется, не теряется совсем-совсем! Честное слово! Цитата Wound @ в этом говнокоде Ты как чукча, о чем вижу - о том пою! Киля ты отвечал не на мой код, а на тот, который сам себе придумал - и осудил! (Кстати. Я - тебя поддерживаю!!!) |
Сообщ.
#297
,
|
|
|
Цитата JoeUser @ С хера ли "выделили"??? Функция вернула указатель в мою стековую переменную на данные из своих "недр". Откуда я знаю что эта портянка говнокода, которую ты привел, делает ? Вот это как раз образец нечитаемой херни, которую даже студенты забраковали бы! Цитата JoeUser @ Lv - не указатель, а флаг успешности/неуспешности отработки функции Init<номер>. Вааще не теряется, не теряется совсем-совсем! Честное слово! Да ладно? Сурьезно? А скажи ка, что делают функции init3(); init4(); init5(); ? И как ты определил что после неуспешного вызова init3 и init4 нужно сделать goto cleanup2;, а после неуспешного вызова init5 нужно сделать cleanup3 ? Я же говорю, из этого говнокода - ничего не понять, эталон говна, так сказать. Ты его сначало перепиши так, чтоб он хоть както читался и в нем была хоть какая то логика, а потом уже спрашивай как это улучшить. Добавлено Цитата JoeUser @ Ты как чукча, о чем вижу - о том пою! Киля ты отвечал не на мой код, а на тот, который сам себе придумал - и осудил! (Кстати. Я - тебя поддерживаю!!!) Ну так в этом говне что ты привел, кроме тебя наверное никто не разберется, потому как одному тебе понятно как оно работает(на самом деле это дерьмо не будет работать в таком виде, а если его закомитить в прод - то скорее всего вызовут на ковер с возможным увольнением по статье профнепригодность). |
Сообщ.
#298
,
|
|
|
Цитата JoeUser @ Неа ... Что «неа»? Цитата JoeUser @ тут случился облом, нужно освободить r1, r2 r1, r2 и r3 гарантированно освобождаются при выходе из процедуры init() Цитата JoeUser @ а cv1=-1 Да пожалуйста error* init(R1& r1, R2& r2, R3& r3) { LV lv; lv = init1(&r1); if (lv != 0) { return "err-1"; } cv1 = init2(&r2); if (cv1 != 0) { set_zero(); return "err-2"; } lv = init3(); if (lv != 0) { cv1 = -1; return "err-3"; } cv2 = init4(); if (cv2 != 0) { return "err-4"; } lv = init5(); if (lv != 0) { set_zero(); return "err-5"; } lv = init6(&r3); if (lv != 0) { set_zero(); return "err-6"; } return null; } error* init() { R1 r1; R2 r2; R3 r3; error* err = init(&r1, &r2, &r3); if (err != null) { return err; } ... ... ... return null; } void set_zero() { cv1 = 0; cv2 = 0; } |
Сообщ.
#299
,
|
|
|
Цитата JoeUser @ Киля ты отвечал не на мой код, а на тот, который сам себе придумал - и осудил! К слову мой пример подходит даже к тому говнокоду, который ты сам себе придумал, и который возможно я даже не так понял. Тебе бы почитать про RAII - основного кита С++, может быть малеха умнее стал, но судя по уровню приведенного кода - я даже не знаю, поймешь ли ты основную идею этой идеологии. На самом деле что предыдущий пример что этот - это как раз реализация RAII в чистом виде, unique_ptr - нужен лишь с единственной целью, чтоб не плодить классы, в него очень удобно оборачивать сишные функции, которые завладевают ресурсами и которые в последствии необходимо освободить. Какой профит от этого? Профит в том, что теперь тебе не нужно думать когда и в каком месте надо вызвать goto или cleanup, ресурс сам знает когда должен уничтожится и управляет временем его жизни и освобождением ресурсов - язык. А значит это более надежнее. |
Сообщ.
#300
,
|
|
|
Цитата Wound @ Откуда я знаю что эта портянка говнокода, которую ты привел, делает ? Вот это самый важный вопрос!!! "Откуда я знаю что эта портянка говнокода, которую ты привел, делает ?" - но советую! Ты - кросава!!! Киля, запомни, и расскажи всем родным и близким - "диавол кроется в мелочах"! Цитата Wound @ эталон говна, так сказать Ошибаешься, это - эталон эталонов говна! Ну бывают такие взаимосвязи в состояниях систем, что да - хочется срать говном. Но если на кону зарплата/гонорар - засунь себе уникальный поинтер в жопу, но просто сделай, чтобы работало. Цитата Wound @ Ну так в этом говне что ты привел, кроме тебя наверное никто не разберется, потому как одному тебе понятно как оно работает И это все потому, что - Я ЛУЧШИЙ в говне! Цитата Wound @ то скорее всего вызовут на ковер с возможным увольнением по статье профнепригодность Я уже 10 лет работаю сам на себя. Максимум - расстреляют, но я не лезу в политику, не митингую. Ну если только изредка, устраиваю молчаливый пикет с вискарем - дома Мечтаю съездить в Париж, поссать с Эйфелефой башни Добавлено korvin, завтра повникаю ... а пока обоснуй - почему в твоем коде 56 строк, а в моем 49 - и ты что, качество "построчно" оцениваешь? Нахрена раздул код?!! |