jueves, 16 de julio de 2009

Ruby RAII

RAII (Resource Acquisition Is Initialization) es una técnica aplicable en muchos lenguajes de programación como C++ y los lengujaes .net que sirve para asegurar que la liberación de un recurso siempre se llevara a cabo al cerrarse un bloque de código sin importar que evento ocurrise (retorno de una funcion, excepcion, etc...). Ruby por supuesto que cuenta con esta posibilidad a través del uso de métodos con bloques de código (palabra clave yield)

He aqui un ejemplo:


#
# La clase X tiene un metodo open para inicializar (open)
# Y uno para cerrar, seria una tragedia si el metodo open
# se invocara y no se invoque el close correspondiente al final
#
#
class X
def open( argument1, argument2 )
print "open with argument1=#{argument1} and argument2=#{argument2}\n"
end

def operation1
print "running operation1\n"
end

def operation2
print "running operation2\n"
end

def close
print "closing\n"
end
end


#
# Mejor usar RAII
#

class X
def self.open( *args )
x_instance = X.new
x_instance.open( *args )
begin
yield(x_instance)
ensure
x_instance.close
end
end
end


#
# Y se usa asi
#
X.open( "arg1", "arg2" ) do |x|
x.operation1
x.operation2
end




Espero que os haya iluminado