- *programming *c++Проблема: несколько путей выхода из scope, в каждом из путей нужно сделать определенные действия (в примере ниже вызвать settings.endGroup ()).
Было: paste.pocoo.org
Стало: paste.pocoo.org
Недостатки:
• Надо тянуть буст!!11.
• Не сразу понятно неопытному человеку, что происходит в 4 строке — кутимоёбы не осилят.
Преимущества:
• endGroup() вызовется всегда, что бы кто потом не написал, ибо это гарантируется компилятором, а не внимательностью разработчика.
• Кутимоёбы не осилят.
Дискасс.
И да, я бы посмотрел на аналогичный код на C#, ну и на любом подобном языке, где финализаторы вообще не обязаны вызываться.
Replies (50)
- @0xd34df00d:@LazyMiha Именно, блеать! А когда я твержу сишарпоебам про то, что там RAII нереализуемо (в таком виде, и я не могу придумать, в каком можно сделать), они кричат «НЕ НУЖНО, У НАС ЕСТЬ ГАРБАДЖ КОЛЛЕКТОР», чем повергают в уныние.
Олсо, телл ми моар про ScopedUpdater.from idead, 9 months ago, in reply to /1 - @jtootf:я откровенно не понимаю, нахрена тебе shared_ptr там, где нужен scoped_ptr. в Haskell аналогичный код выполняется с помощью bracket, в CL — с помощью unwind-protectfrom galois, 9 months ago
- @0xd34df00d:@jtootf Я знаю про bracket, спасибо, но хаскель не очень C#-like.
Олсо, я сходу не помню, есть ли scoped_ptr (T *obj, D deleter), а про shared_ptr помню точно, что есть.from idead, 9 months ago, in reply to /3 - @jtootf:@0xd34df00d ты просил любой подобный язык, где финализаторы не обязаны вызыватьсяfrom galois, 9 months ago, in reply to /4
- @0xd34df00d:@jtootf В хаскеле уже можно задавать, что должно произойтись, когда GC решит, гм, прибить объект?
Знаю, что предыдущая фраза может быть некорректна с точки зрения терминологии, но уж прости мне это :3from idead, 9 months ago, in reply to /5 - @0xd34df00d:@jtootf Тогда я едва ли сказал бы, что в хаскеле есть финализаторы. ЕМНИП так в сишарпах всяких называется то, что наиболее близко к плюсовым деструкторам.from idead, 9 months ago, in reply to /7
- @jtootf:@0xd34df00d и тем не менее, нужный тебе функционал там реализауется. например, посредством bracketfrom galois, 9 months ago, in reply to /8
- @0xd34df00d:@jtootf Я знаю. Речь шла о C-подобных языках со сборкой мусора и отсутствием возможности явно запланировать что-то при выходе из скоупа.
Не, ну на сишарпе, прозреваю, можно извратиться с try/catch/finally, но это пиздец.from idead, 9 months ago, in reply to /9 - @Stiletto:@0xd34df00d Почему файналли это извращение? Оно, блять, для этого и было придуманоfrom web, 9 months ago, in reply to /10
- @0xd34df00d:@Stiletto foreach (blah)
{
settings.beginGroup();
try { if (foo()) break; }
catch {}
finally { settings.endGroup(); }
}
Это корректный код, который будет делать то, что нужно?from idead, 9 months ago, in reply to /11 - @0xd34df00d:@Stiletto Гм, любопытный метод решения задачи, да, agreed. Забавно, что ты первый из всех, кто о нем сказал.from idead, 9 months ago, in reply to /13
- @LazyMiha:@0xd34df00d У нас в платформе есть такой небольшой хелпер-класс, правда его функциональность немного более широкая, он юзается для рассылки оповещений после окончания вложенных изменений.from Дом, 9 months ago, in reply to /2
- @0xd34df00d:@LazyMiha Што, зачем? Есть же boost::shared_ptr с конструктором. принимающим делитер.from idead, 9 months ago, in reply to /17
- @0xd34df00d:from idead, 9 months ago, in reply to /3
- @LazyMiha:@0xd34df00d а рассылки евентов чилдам, а несколько подписчиков на евенты? %) бывают и такие необходимостиfrom Дом, 9 months ago, in reply to /18
- @0xd34df00d:@LazyMiha Гроздья из биндов, уняня.
Не, ну серьезно, пихаешь в делитер произвольную функцию, которая, например, жрет список подписчиков и ивент, байндишь к ней, собсна, сформированный чуть ранее список подписчиков и ивент. ПРОФИТ.from idead, 9 months ago, in reply to /20 - @LazyMiha:@0xd34df00d Можно и так, но как грится отладка кода требует на порядок больше ума, чем его написание, так что чем проще используемые элемпенты — тем легче работается =)from Дом, 9 months ago, in reply to /21
- @0xd34df00d:@jtootf Не думаю, что это имеет смысл, scoped_ptr на то и есть такой. что он легковесный и тупой умный указатель, не зря же. Мол, хочешь кастомных извращений в делитерах — изволь shared_ptr.from idead, 9 months ago, in reply to /24
- @jtootf:@0xd34df00d тупой умный указатель — это хорошо, да. для контроля scope ты неразделяемо используешь shared_ptr со счётчиком ссылок, это тоже окfrom galois, 9 months ago, in reply to /25
- @0xd34df00d:@jtootf А что? Ты паришься о производительности счестчика ссылок там, где, как минимум, есть конвертация туда-сюда кастомных кутешных QVariant'ов (union для non-POD) в строки и их сравнение, а как максимум идет IO?
Premature optimization is sooooo premature.from idead, 9 months ago, in reply to /26 - @0xd34df00d:@jtootf > для контроля scope
со счетчиком ссылок
Мой парсер парсит так, что ты считаешь это оверкиллом для задачи. А не пофиг ли, как он внутри устроен в данном контексте? Не пофиг ИМХО только в том случае, если тебя заботит производительность реализации.from idead, 9 months ago, in reply to /28 - @jtootf:@0xd34df00d у тебя херовый парсер. и меня откровенно задолбала жуйкотрадиция херовых парсеров, которые вычитывают в моих словах то, чего я не говорил. блеать, хотите поговорить сами с собой — пожалуйстаfrom galois, 9 months ago, in reply to /29
- @0xd34df00d:@jtootf А тогда причем там указание на счетчик ссылок? Я исхожу из того, что все сказанные слова имеют смысл, и ничего не говорится просто так.from idead, 9 months ago, in reply to /30
- @jtootf:@0xd34df00d но подумать при этом тебе лень, куда важней побыстрее написать ответ. в данный момент ты используешь инструменты не по назначению, против их семантики; не знаю, как это называешь ты, а я называю это костылёмfrom galois, 9 months ago, in reply to /31
- @jtootf:@0xd34df00d всё, что я хотел сказать, я уже сказал. традиция жевать сопли на n комментов меня достала, извините. удачи в разработкеfrom galois, 9 months ago, in reply to /33
- @LazyMiha:@werehuman ПОТОМУЧТО КУТИ ВРАППЕРЫ ДЕФАЙНЫ РАЗПИДАРАСИЛО!from Дом, 9 months ago, in reply to /35
- @0xd34df00d:@werehuman Нет, в C# — нет. Гарбадж коллектор имеет право ни разу их не вызвать, если не нужна память, например.from idead, 9 months ago, in reply to /39
- @0xd34df00d:@werehuman Пиздец, сколько лишних строк. Олсо, в C++0x есть, хм... А я не вижу проблем в том коде )from idead, 9 months ago, in reply to /44
- @0xd34df00d:@werehuman А еще можно написать auto guard в C++ 0x, и понадеяться, что type inference-движок сожрет это дело.from idead, 9 months ago, in reply to /46
- @0xd34df00d:@werehuman И чтоделац? Писать как было? Это же тупо и костыли.from idead, 9 months ago, in reply to /50
- @0xd34df00d:@werehuman Перечитай, пожалуйста, еще раз секцию «Плюсы» в /0. Я немного за другим гонюсь.from idead, 9 months ago, in reply to /53
- @ulidtko:@0xd34df00d позволю себе ещё потупить: в плюсцах нет finally?from lunatic asylum, 9 months ago, in reply to /56