Программисты других языков, помимо C ++, используют, знают или понимают RAII? - PullRequest
33 голосов
/ 03 октября 2008

Я заметил, что RAII привлекает много внимания к Stackoverflow, но в моих кругах (в основном C ++) RAII настолько очевиден, что все равно, что спрашивать, что такое класс или деструктор.

Так что мне действительно любопытно, если это происходит потому, что меня ежедневно окружают жесткие программисты C ++, а RAII вообще не так хорошо известен (включая C ++), или если все эти вопросы о Stackoverflow связаны к тому, что я сейчас общаюсь с программистами, которые не выросли на C ++, а на других языках люди просто не используют / не знают о RAII?

Ответы [ 17 ]

1 голос
/ 03 октября 2008

Смысл RAII в том, что он требует детерминированной финализации, что гарантировано для стековых объектов в C ++. Такие языки, как C # и Java, основанные на сборке мусора, не имеют такой гарантии, поэтому их нужно каким-то образом «прикрутить». В C # это делается путем реализации IDisposable, и многие из тех же шаблонов использования затем возникают в основном, что является одним из мотиваторов для оператора «using», оно обеспечивает удаление и очень хорошо известно и используется.

Так что в основном идиома есть, у нее просто нет причудливого названия.

0 голосов
/ 03 октября 2008

Это как-то связано с знанием, когда ваш деструктор будет вызван, правда? Так что это не полностью не зависит от языка, учитывая, что это не дано во многих языках GC.

0 голосов
/ 03 октября 2008

RAII популярен в C ++, потому что это один из немногих (только?) Языков, который может размещать сложные локальные переменные области видимости, но не имеет предложения finally. C #, Java, Python, Ruby имеют finally или эквивалент. C не имеет finally, но также не может выполнить код, когда переменная выходит из области видимости.

0 голосов
/ 03 октября 2008

RAII специфичен для C ++. В C ++ есть необходимая комбинация выделенных в стеке объектов, времени жизни неуправляемых объектов и обработки исключений.

0 голосов
/ 11 октября 2008

У меня есть коллеги, которые являются опытными, читают спецификацию типов C ++. Многие из них знают RAII, но я никогда не слышал, чтобы его использовали за пределами этой сцены.

0 голосов
/ 11 октября 2008

CPython (официальный Python, написанный на C) поддерживает RAII из-за его использования объектов с подсчетом ссылок с немедленным уничтожением на основе области действия (а не при сборке мусора). К сожалению, Jython (Python в Java) и PyPy не поддерживают эту очень полезную идиому RAII, и она ломает много унаследованного кода Python. Так что для переносимого Python вы должны обрабатывать все исключения вручную, как Java.

0 голосов
/ 03 октября 2008

Я думаю, что многие другие языки (например, не имеющие delete) не дают программисту одинаковый контроль над временем жизни объекта, и поэтому должны быть другие средства для обеспечения детерминированного удаления ресурсов. Например, в C # обычно используется using с IDisposable.

...