Я тут решил познакомиться с Ruby и наткнулся code block's, которые
позволяют реализовать вот такие интересные вещи:
class File
def File.open_and_process(*args)
f = File.open(*args)
yield f
f.close()
end
end
File.open_and_process("file", "r") do |file|
while line = file.gets
puts line
end
end
То есть, мы, как создатели класса 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