13.10.11

Blocks, closures y objetos

Cuando ando de paseo por el mundo Ruby (especialmente RoR) me suelo encontrar con bastantes do y end (ciertamente me recuerdan PASCAL), o en una sola linea { y }, esto es lo que llamamos convencionalmente bloques (de instrucciones).

# método de configuración
config :scope, do |bag|
  bag.set :key, 'value'
end

Nada nuevo, tampoco para aburrirse, lo bonito de este lenguaje es la manera en que maneja estos conceptos de bloques. Pero también tiene una sintaxis poderosa, breve y bastante agradable de leer y escribir.
¿Hago mal en preferir un lenguaje también por su estética?

Tampoco voy a dar una clase de bloques en ruby, pero me interesa en concreto el concepto de lambda y su utilización como callback en algunos escenarios cotidianos en los lenguajes de programación de alto nivel como lo es también PHP.
Y no hay que buscar demasiado, la versión mas reciente del pre-procesador de hipertexto ya venía con torta bajo el brazo, pues ofrece bastante potencial en la orientación a objetos así como con este bonito concepto que es un closure. De hecho, en php un closure por si mismo es un objeto, una clase.
// método de configuración
config('scope', function ($bag) {
  $bag->set('key', 'value');
});

Finalmente me parece que su funcionalidad es la misma, contener un grupo de instrucciones en un contexto aislado, sin importar si devuelve un resultado o no.

Así como el ejemplo de un método de configuración cualquiera se pueden dar otras alternativas mas flexibles, aquí otra definición:

// agregamos un nuevo libro en alguna colección
function add_book_to($user, Closure $describe) {
  $book = $user->books->build();
  $describe($book);
  $book->save();
}

// seleccionamos a un usuario
$me = user::first_by_name('Alvaro');

// agregamos el libro
add_book_to($me, function ($book) {
  $book->title = 'Fake title';
  $book->description = 'Fake description';
}); 

Y la verdad es que una función anónima implementada en php tiene bastantes desventajas a comparación de otros lenguajes, pero tampoco es inútil. Se pueden conseguir features interesantes en cuanto a flexibilidad en php.

Chiro-liro

No hay comentarios: