| Re: [ruby, python] - code block | |
| От: | Sinclair rsdn | ||
| Дата: | 13.03.09 11:57 | ||
| Оценка: | 5 (1) +1 | ||
| Здравствуйте, DemAS, Вы писали: DAS>Я тут решил познакомиться с Ruby и наткнулся code block's, которые DAS>позволяют реализовать вот такие интересные вещи: DAS>
DAS>То есть, мы, как создатели класса File можем гарантировать закрытие файла, DAS>не полагаясь на память и внимательность пользователя этого класса. Ага. Ну, или, аналогичным образом мы могли бы сделать эту вешчь на дотнете:
А вот всё, что понадобилось, чтобы оно компилялось:
DAS>Если бы данную задачу решать на обобщенном ООП языке, то наверное можно DAS>было бы воспользоваться примерно такой конструкцией: DAS>Может есть какие-то более удобные паттерны и приемы, не привязанные к DAS>конкретному языку программирования, достигать такой же цели — гарантировать DAS>освобождение ресурсов? Вообще говоря — да. Вся идея выражается одним словом: callback. То есть вместо того, чтобы дать пользователю неконтролируемый доступ к некоторому ресурсу (например, FileStream), мы заставляем его передать нам объект, в который мы дадим ресурс на время. В моем примере всё построено на делегате Action<FileStream>. В жаве, к примеру, то же самое было бы сделано в виде интерфейса (а прикладной код был бы построен на анонимных классах). Требовать наследования в данном случае — оверкилл. Попробуй себе представить код, который копирует из файла A в файл B. ... << RSDN@Home 1.2.0 alpha rev. 677>> |
| Re: [ruby, python] - code block | |
| От: | z00n | ||
| Дата: | 13.03.09 11:18 | ||
| Оценка: | 5 (1) | ||
| Здравствуйте, DemAS, Вы писали: DAS>Может есть какие-то более удобные паттерны и приемы, не привязанные к DAS>конкретному языку программирования, достигать такой же цели — гарантировать DAS>освобождение ресурсов? Конечно есть — для этого нужны первоклассные функции. Вот реализации на нескольких языках — общее уловить несложно: — Если в языке нет аналога finally(unwind-protect) — написать его — передавать то, что нужно сделать сделать с ресурсом в виде анонимной функции http://scala.sygneca.com/patterns/loan
http://groups.google.fi/group/comp.lang.functional/browse_frm/thread/5385c76d82a78171
Lua: http://www.lua.ru/forum/posts/list/15/89.page#704 — основан на SML варианте
Если бы я знал, как в Питоне передавать анонимные функции как аргументы (lambda?) — я добавил бы пример. |
| [ruby, python] - code block | |
| От: | DemAS | ||
| Дата: | 13.03.09 09:32 |
| Я тут решил познакомиться с Ruby и наткнулся code block's, которые позволяют реализовать вот такие интересные вещи:
То есть, мы, как создатели класса File можем гарантировать закрытие файла, не полагаясь на память и внимательность пользователя этого класса. Похожую вещь можно сделать и в Python с помощью ключевого слова with (http://expl0rer.wordpress.com/2009/03/04/with_in_python/), но даже в этом случае мы не застрахованы от того, что пользователь при работе с классом забудет о использовании слова with. Наверное, в Python можно попробовать использовать декораторы, но я сходу не нашел возможности получить из декоратора параметр (файловый дескриптор, в данном случае). Такая возможность есть или параметры передаются только в декоратор? Если бы данную задачу решать на обобщенном ООП языке, то наверное можно было бы воспользоваться примерно такой конструкцией: Реализовать базовый класс: Base(object): private file; public work_with_file(file): pass public run(): file = openfile() work_with_file(file) close_file(file) и заставить пользователя создавать для работы с файлами наследника от моего, перекрывая метод work_with_file(file): First(Base): public work_with_file(file): // do some work with file Может есть какие-то более удобные паттерны и приемы, не привязанные к конкретному языку программирования, достигать такой же цели — гарантировать освобождение ресурсов? Posted via RSDN NNTP Server 2.1 beta |
| Re[2]: [ruby, python] - code block | |
| От: | Gajdalager | ||
| Дата: | 13.03.09 11:27 |
| Здравствуйте, z00n, Вы писали: Z>Здравствуйте, DemAS, Вы писали: DAS>>Может есть какие-то более удобные паттерны и приемы, не привязанные к DAS>>конкретному языку программирования, достигать такой же цели — гарантировать DAS>>освобождение ресурсов? Скип А в языках без поддержки ФВП можно использовать GOF-паттерн Command. << RSDN@Home 1.2.0 alpha 4 rev. 1128>> Сейчас играет Тінь Сонця — Гнилгород |
| Re[2]: [ruby, python] - code block | |
| От: | DemAS | ||
| Дата: | 13.03.09 12:08 |
| Z>Если бы я знал, как в Питоне передавать анонимные функции как аргументы (lambda?) — я добавил бы пример. Угу. Идею понял:
Ок. В языках. допускающих использование функций, как параметр другой функции возможно такое решение. В C++, наверное, можно воспользоваться указателем на функцию. |
| Re[2]: [ruby, python] - code block | |
| От: | thesz | ||
| Дата: | 13.03.09 12:37 |
| DAS>>Может есть какие-то более удобные паттерны и приемы, не привязанные к DAS>>конкретному языку программирования, достигать такой же цели — гарантировать DAS>>освобождение ресурсов? S>Вообще говоря — да. Вся идея выражается одним словом: callback. "Скобки".
И даже имеет некоторое выражение в самих языках программирования. Собственно, открывая скобку { мы даём программисту возможность что-то делать с контекстом, который мы гарантировано вернём в исходное состояние путём закрывающей скобки }. Они встречаются и в других местах, где надо контролировать состояние, glBegin/glEnd приходит в голову первым. Это связывает исключения и goto, кстати. И вообще, такой подход позволяет тесней увязать языки программирования и библиотеки, получая DS(E)L на выходе. S>То есть вместо того, чтобы дать пользователю неконтролируемый доступ к некоторому ресурсу (например, FileStream), мы заставляем его передать нам объект, в который мы дадим ресурс на время. S>В моем примере всё построено на делегате Action<FileStream>. В жаве, к примеру, то же самое было бы сделано в виде интерфейса (а прикладной код был бы построен на анонимных классах). S>Требовать наследования в данном случае — оверкилл. Попробуй себе представить код, который копирует из файла A в файл B.
В скобочной нотации как раз в самый раз. Да и в с объектами-наследниками "хранителя файла" тоже должно получиться неплохо, хотя и более громоздко. Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru) |
| Re: [ruby, python] - code block | |
| От: | D. Mon | ||
| Дата: | 13.03.09 14:47 |
| Здравствуйте, DemAS, Вы писали: DAS>
DAS>То есть, мы, как создатели класса File можем гарантировать закрытие файла, DAS>не полагаясь на память и внимательность пользователя этого класса. Гарантировать? А исключения как же? Впрочем, переписать с использованием begin/rescue не сложно. DAS>Может есть какие-то более удобные паттерны и приемы, не привязанные к DAS>конкретному языку программирования, достигать такой же цели — гарантировать DAS>освобождение ресурсов? Ага, деструкторы. |
| Re[2]: [ruby, python] - code block | |
| От: | DemAS | ||
| Дата: | 13.03.09 17:12 |
| > Ага, деструкторы. В управляемых языках, насколько я понимаю, деструктор вызывается при сборке объекта GC, и когда он уничтожит наш объект мы гарантировать не можем. А неуправляемых языков не так много и осталось — C++, и пожалуй все. Posted via RSDN NNTP Server 2.1 beta |
| Re[3]: [ruby, python] - code block | |
| От: | _nn_ | ||
| Дата: | 13.03.09 22:33 |
| Здравствуйте, DemAS, Вы писали: Z>>Если бы я знал, как в Питоне передавать анонимные функции как аргументы (lambda?) — я добавил бы пример. DAS>Угу. Идею понял: DAS>
DAS>Ок. В языках. допускающих использование функций, как параметр другой функции возможно такое решение. Различие в добавлении сахара. Вот в питоне, к примеру, невозможно сделать с лямбдой более одного действия и приходится придумывать локальную функцию. А в руби можно передать сразу анонимный блок. DAS>В C++, наверное, можно воспользоваться указателем на функцию. В С++ пользуются шаблоннами. Смотреть Standard Library:
|
| Re[3]: [ruby, python] - code block | |
| От: | Sinclair rsdn | ||
| Дата: | 14.03.09 01:55 |
| Здравствуйте, thesz, Вы писали: T>В скобочной нотации как раз в самый раз. Это понятно. T>Да и в с объектами-наследниками "хранителя файла" тоже должно получиться неплохо, хотя и более громоздко. Вот это — нет. Непонятно, как мы будем наследоваться от хранителя файла дважды. ... << RSDN@Home 1.2.0 alpha rev. 677>> |
| Re[3]: [ruby, python] - code block | |
| От: | Adriano | ||
| Дата: | 14.03.09 09:20 |
| Здравствуйте, DemAS, Вы писали: ... DAS>Ок. В языках. допускающих использование функций, как параметр другой функции возможно такое решение. DAS>В C++, наверное, можно воспользоваться указателем на функцию. В С++ есть деструкторы и все ресурсы, которые были инициализированы, будут гарантированно освобождены.
|
| Re[3]: [ruby, python] - code block | |
| От: | Adriano | ||
| Дата: | 14.03.09 09:21 |
| Здравствуйте, DemAS, Вы писали: >> Ага, деструкторы. DAS>В управляемых языках, насколько я понимаю, деструктор вызывается при сборке DAS>объекта GC, и когда он уничтожит наш объект мы гарантировать не можем. а в С++ можем |