Re[15]: Не выпендриваюсь ли я?
От: BulatZiganshin  
Дата: 30.07.07 07:29
Оценка:
>> try {
>> подготовка обстановки;
>> работа;
>> } finally {
>> восстановление обстановки;
>> }
C>Проблема тут в том, что можно забыть добавить нужное
C>cleanup-действие в "восстановление обстановки".
C>В этом отношении RAII намного лучше — мы уже не можем забыть освободить
C>ресурс (ну если _очень_ не захочем).

это как раз ещё один случай, где очень удобны лямбды. вот как это выглядит в хаскеле:

bracket (openFile filename) closeFile \$ handle -> do
    x <- readLn handle
    ...


действие closeFile синтаксически описывается рядом с openFile и будет выполнено над возвращённым хендлом в обоих случаях. более того, это легко выделить в отлельную функцию — это будет аналог вашего служебного класса:

withFile filename = bracket (openFile filename) closeFile

withFile "autoexec.bat" \$ handle -> do
    x <- readLn handle
    ...


плюс к этому, логика try/finally жёстко задана в компиляторе, а при использовании функций/классов в них легкко можно добавить свои погремушки. я например недавно таким образом добавил обработку ^Breal

C>Количество необходимых служебных классов, на практике, у меня получается

C>очень небольшим. ON_BLOCK_EXIT + boost::bind справляются с 90% случаев.

а как выглядит этот код? как я понимаю, те же лямбды, только сахар не такой сладкий?
Люди, я люблю вас! Будьте бдительны!!!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.