LINUX.ORG.RU

История изменений

Исправление Dudraug, (текущая версия) :

Все таки я офигиваю, как люди могут путать транзакции и освобождение ресурса (ЛЮБОГО, даже файла, даже сети). RAII идеально ложиться на файлы. Кто отменял наличие метода close с исключениями, кодом ошибками и шлюхами? Никто. А вот ошибки в клиентском коде сплошь и рядом. Забыли поймать исключение, не продумали ветку и получай выход из функции с все еще открытым файлом. . А потом этот файл не откроешь из других кусков программы, или даже из других программ пока процесс жив. И что это хорошо?

Программисты люди, они делают ошибки. А допустить ошибку в 100500 функциях клиентского кода куда проще, чем в коде одного единственного библиотечного класса. Если добавить в библиотечный код, в деструктор насильное (с попыткой сохранения данных) освобождение ресурса, то многие фейлы просто исключаются. Да, в случае умных указателей и мьютексов RAII - это средство экономии кода и попытка избежать написания бессмысленного общего финализирующего блока, а так же перенос обязанности анлока/освобождения памяти на либу(на самом деле не только). Но очень часто освобождение ресурса в деструкторе - это защита от дурака. Если ты освободил ресурс в либе, то в коде юзающим твой класс критических ошибок будет меньше.

Почему люди пытаются ругать RAII за то что она не решает проблемы, которые и не должна решать? Деструкторы и НЕ должны завершать транзакции (На самом деле можно, если поизвращаться, но в общем случае нет).

Исходная версия Dudraug, :

Все таки я офигиваю, как люди могут путать транзакции и освобождение ресурса (ЛЮБОГО, даже файла, даже сети). RAII идеально ложиться на файлы. Кто отменял наличие метода close с исключениями, кодом ошибками и шлюхами? Никто. А вот ошибки в клиентском коде сплошь и рядом. Забыли поймать исключение, не продумали ветку и получай выход из функции с все еще открытым файлом. . А потом этот файл не откроешь из других кусков программы, или даже из других программ пока процесс жив. И что это хорошо?

Программисты люди, они делают ошибки. А допустить ошибку в 100500 функциях клиентского кода куда проще, чем в коде одного единственного библиотечного класса. Если добавить в библиотечный код, в деструктор насильное (с попыткой сохранения данных) освобождение ресурса, то многие фейлы просто исключаются. Да, в случае умных указателей и мьютексов RAII - это средство экономии кода и попытка избежать написания бессмысленного общего финализирующего блока, а так же перенос обязанности анлока/освобождения памяти на либу(на самом деле не только). Но очень часто освобождение ресурса в деструкторе - это защита от дурака. Если ты освободил ресурс в либе, то в коде юзающим твой класс критических ошибок будет меньше.

Почему люди пытаются ругать RAII за то что она не решает проблемы, которые и не должна решать. Деструкторы и НЕ должны завершать транзакции (На самом деле можно, если поизвращаться, но в общем случае нет).