miércoles, julio 30, 2008

Acerca de Linq

"Vos si te llenas de mocos por bobadas"... Eso me dijo alguien cuando le dije que necesitaba responder al comentario de un amigo en Twitter. Y si... lleno de mocos y todo empiezo. :P

Pues bien. Es básicamente lo siguiente:

febuiles http://xrl.us/ok5v2 "The idea that you can express your intent in terms of higher-level query expressions is really new" - Nope, sorry.

diegoeche @febuiles porque no es nueva?

febuiles @diegoeche: Twitter no es el medio: Tumblr

Y el post es básicamente esto:

var products = from p in db.Products
where p.Category.CategoryName == "Beverages"
select p;

products = Products.find_by_category_name("Beverages")

Los queries que abstraen condiciones de un nivel inferior (en este caso SQL) no son una idea nueva. Los dos ejemplos anteriores hacen lo mismo y solo difieren en sintaxis.


Decir que Linq es ultra-novedoso es no saber medir el adjetivo "ultra-novedoso". Linq es 90% Marketing y 10% buenas ideas... el que no se haya dado cuenta de eso es un MVP cerebri-lavado.

No comparto la idea de Eric Meijer, sin embargo creo que el ejemplo está muy mal escogido.

En primer lugar no consideraría llamar una función con un nombre bonito un DSL. De hecho me parece sobre simplificar el termino llamar DSL a cualquier conjunto de identificadores bonitos dentro de una sintaxis externa para una tarea específica. De la misma manera me parece erróneo llamar a "está función con nombre bonito" algo equivalente "higher-level query expressions".

La sentencia de Linq después de de-sugaring es algo como:

db.Products.Where(p => p.Category.CategoryName == "Beverages").Select(p => p);
(Probablemente por usar la proyección de identidad se omita el último Select)


Eso no es nuevo... reemplaza uno filter por Where y map por Select y es algo tan viejo como Lisp (de pronto anterior?) y me parece muy de "alto nivel". Lo que creo que se refiere Meijer como "nuevo" es precisamente el de-sugaring (que por lo que tengo entendido va pasando la la variable "p" por medio de una monada).

Así que cuando dice "Los dos ejemplos anteriores hacen lo mismo y solo difieren en sintaxis." Resulta un comentario vacuo.

Uno puede pasar funciones en Java usando clases anónimas de un solo método y puede decir uno "Java hace lo mismo que haskell... solo difiere la sintaxis"

O acaso un foreach no es nuevo comparado con un for??
Ambos hacen lo mismo... difieren en la sintáxis... y si encapsulo el for en una función que lo haga ver bonito? la inclusión del foreach en un lenguaje de programación como elemento sintáctico deja de ser nueva? no.

Pero es precisamente ésto a lo que se refiere Eric Meijer. Incluir sintaxis adicional en el lenguaje con el fin de operar con colecciones es "nuevo". Que tan nuevo? tan nuevo como Linq? la verdad no sé.

Y novedoso? Pues uno usando la monada de lista de haskell puede hacer lo que hacen las Query Expressions.

Ahora bien... se que es estúpido escribir en vez de una refutación un "el argumento que usaste es muy malo" pero hace rato no escribía.