I’m a Plain guy

“The truth that lies before us now is plain for all to see
To grow without is not to grow within.


 


KANSAS “No one together” (1980)


 


Es para mí un orgullo anunciar mi incorporación como Development Advisor a Plain Concepts, the Microsoft technologies Know-how company, donde espero dar lo mejor de mí y crecer intelectualmente (como parece sugerir la letra de mi banda favorita) junto a excelentes amigos y grandes especialistas en sus respectivas áreas como Pablo Peláez, Iván González, Rodrigo Corral, Unai Zorrilla, Jorgito Serrano, Marco Amoedo o Cristian Manteiga, entre otros.

Arte digital con C# 3.0 y LINQ

De entre la avalancha de vídeos, documentos y enlaces que con los que nos abrumó Charlie Calvert simultáneamente con la salida de la última CTP de Orcas (marzo), me llamó especialmente la atención una referencia a un post de Wes Dyer, miembro del equipo de desarrollo de C#, en el que éste muestra una aplicación que permite, mediante un curioso algoritmo, “aproximar” una imagen en una consola DOS mediante caracteres ASCII. Algo como lo siguiente (he utilizado una foto de mi hija Diana para presumir de ella):



Aunque algunas expresiones de consulta pueden parecer algo forzadas, y se hace uso y abuso de métodos extensores, algo que está aún por ver si la práctica avalará, este programa es un buen ejemplo práctico del tipo de código C# que se podrá encontrar en un futuro nada lejano. Por ello, le recomiendo que le eche un vistazo. Si va a ejecutarlo sobre la CTP de marzo, tenga en cuenta que antes tendrá que resolver dos o tres problemillas de compilación debidos a que el autor utilizó una versión más avanzada de Orcas que la CTP. Las modificaciones del código necesarias se describen también en el blog.


 

Novedades en la CTP de Orcas de marzo de 2007

Como otros colegas ya han anunciado, está disponible desde hace unos días la CTP de marzo de Orcas, que se puede descargar desde aquí:


    http://www.microsoft.com/downloads/details.aspx?familyid=281fcb3d-5e79-4126-b4c0-8db6332de26e&displaylang=en


Yo no he tenido ni que descargármela, gracias a la gentileza de mi buen amigo Unai Zorrilla.


Aquí va un resumen de las características más relevantes de la CTP relacionadas con los lenguajes y LINQ (aunque la CTP contiene muchísimo más):


·         LENGUAJES


o        Soporte para las características de C# 3.0: Esta CTP implementa todas las características del lenguaje C# 3.0 que ofrecía la CTP de LINQ de mayo de 2006:


§         Expresiones de consulta


§         Inicializadores de objetos y colecciones


§         Métodos extensores


§         Inferencia de tipo de variables locales y tipos anónimos


§         Lambdas asociadas a delegados y árboles de expresiones


§         Soporte completo de tiempo de diseño: Intellisense, formato, colorización


o        Soporte para las características de VB 9.0: Esta CTP implementa las siguientes características del lenguaje:


§         Expresiones de consulta: soporte de consultas, filtrado y ordenación


§         Inicializadores de objetos


§         Métodos extensores


§         Inferencia de tipo de variables locales


§         Tipos anónimos


§         Literales XML


§         Propiedades XML


§         Intellisense para nueva línea y para expresiones


·         LINQ


o        LINQ to Objects


§         La API de LINQ to Objects permite consultas sobre cualquier colección .NET, como arrays y listas genéricas. Esta API se define en el espacio de nombres System.Linq dentro de System.Core.dll.


o        LINQ to XML (XLinq)


·         Añadidas las clases del espacio System.Xml Bridge, que contienen un conjunto de métodos extensores que permiten utilizar XPath y XSLT sobre árboles de LINQ to XML, producir un árbol de LINQ to XML mediante una transformación XSLT, y validar un árbol de nodos XElement contra un esquema XML.


·         Modelo de eventos, que hacen posible la sincronización eficiente de árboles LINQ to XML con una interfaz gráfica de usuario (por ejemplo, una aplicación WPF).


·         Cambios en la jerarquía de clases – añadida la clase XObject, eliminada (temporalmente) XStreamingElement.


·         Mejoras de usabilidad varias – se han realizado varias modificaciones menores en respuesta a estudios internos y sugerencias externas, para hacer la API más limpia y consistente.


o        LINQ to ADO.NET


·         ADO.NET se integra completamente con LINQ y ofrece múltiples opciones para utilizar LINQ en varios escenarios: LINQ to SQL ofrece acceso directo a tablas de bases de datos desde el entorno de programación, LINQ to Entities permite a los desarrolladores utilizar LINQ sobre modelos EDM (Entity Data Models), y LINQ to DataSet permite utilizar toda la expresividad de LINQ sobre DataSets.


·         LINQ to Entities permite a los desarrolladores programar contra una base de datos relacional utilizando una vista de los datos apropiada para la aplicación que están construyendo, independientemente de la estructura de la base de datos subyacente. El uso de modelos EDM permite a los desarrolladores diseñar modelos que sigan los conceptos naturales de la aplicación, en lugar de tener que mapearlos a las construcciones que ofrecen los almacenes relacionales. LINQ to Entities está creado sobre el modelo de proveedor de ADO.NET y permitirá trabajar contra diversos almacenes de datos relacionales, además de contra Microsoft SQL Server. Esta CTP incluye un proveedor de LINQ to Entities para SQL Server y SQL Server Compact Edition.


·         LINQ to SQL (antes conocido como DLinq) ha mejorado su funcionalidad con respecto a la CTP de mayo de 2006. Puede encontrar esta API en el espacio de nombres System.Data.Linq dentro del ensamblado System.Data.Linq.dll. Una novedad de esta edición es que la clase DataContext ofrece modos optimizados para la utilización en modo de solo lectura y la serialización. También es nuevo que la clase DataShape simplifica la carga temprana y añade la posibilidad de establecer consultas sobre relaciones.


o        Diseñador de LINQ to SQL


            ·         Ahora es posible crear métodos a partir de procedimientos almacenados y funciones dentro del diseñador.


            ·         Mejor gestión de los esquemas de bases de datos.


            ·         Soporte mejorado para la herencia en el diseñador.


 

¿Se avecina una revolución, o solo me lo parece?

“Finally the tables are starting to turn


I’m talkin’ about a revolution…”


 


Tracy Chapman


 


Hace unos días, en respuesta a un post sobre la disponibilidad de LINQ to SQL, mi admirado amigo Rodrigo Corral me escribía:



“A más de uno se nos ponen los pelos como escarpias cada vez que oímos SQL y LINQ en la misma frase … ya me gustaría leer tu opinión sobre el tema”


Aunque normalmente evito generar polémicas, y sobre todo las que conducen a “diálogos entre sordos”, como decía Gorbachev, he pensado en plasmar en este artículo mis ideas al respecto, en busca de las opiniones de algunos de los muchos desarrolladores inteligentes que escriben aquí o visitan estas páginas regularmente.


Ante todo, quiero dejar claro lo siguiente:


·         Nada más lejos de mis intenciones que atacar a nadie ni de menospreciar su trabajo.


·         No me considero ningún “gurú” ni nada por el estilo; mis opiniones pueden ser totalmente erradas. Sí soy alguien que tiene la suerte de llevar 20+ años programando y enseñando a programar con espíritu crítico, y de haber vivido casi desde cero el desarrollo de los lenguajes y sistemas de programación.


Luego quiero expresar convicciones personales adquiridas de la experiencia y de las que será difícil moverme:


·         Con sus posibles defectos, la POO es, de los paradigmas de programación hoy en uso, el que mejor permite modelar el universo en que vivimos y que mejor se adecua a las necesidades de los desarrolladores de aplicaciones. No sé si será el paradigma definitivo (“ultimate”, dirían en inglés), pero en el panorama no se vislumbra ningún otro capaz de sustituirlo a corto o mediano plazo. Sí hay que reconocer que los lenguajes .NET están también “importando” conceptos de otros “mundos” como la programación funcional, que vienen a enriquecer el modelo OO sin variar su esencia.


·         La manera en que desarrollamos hoy, por ejemplo, las aplicaciones que acceden a bases de datos corporativas lleva implícito un desajuste de impedancia provocado por la necesidad de tener que, desde lenguajes OO, usar SQL para expresar las sentencias de recuperación y almacenamiento persistente de los datos. SQL es un lenguaje diferente, basado en otro paradigma de programación, que tiene su curva de aprendizaje, y cuyas sentencias finalmente embebemos dentro de nuestras aplicaciones en forma de cadenas de caracteres que se saltan “a la torera” el control del compilador.


Bueno, después del “prólogo”, aquí va entonces mi predicción:


·         Dentro de unos pocos años, los desarrolladores de aplicaciones no escribirán ni una sola sentencia SQL en sus aplicaciones.


No sé si mi predilección por los trabajos de Hejlsberg (a quien sigo desde los tiempos de Turbo Pascal 1.0, circa 1984) me nuble la vista, pero pienso que LINQ está entre lo más relevante que ha generado el desarrollo de los lenguajes de programación en muchos años. Creo que la posibilidad de ejecutar consultas integradas en el lenguaje de manera uniforme contra los más diversos almacenes de datos, empezando por las colecciones de datos en memoria y terminando por los documentos XML y las bases de datos SQL (más todo lo demás que se tercie) es algo que hará mucho más productivos a los programadores, más claros y mantenibles a nuestros programas y que reducirá sensiblemente la curva de aprendizaje de los principiantes.


 


Pero con la aparición de LINQ no solo dejará de ser necesario escribir sentencias SELECT. Como puede leerse en el excelente post de Juan Carlos González, LINQ To SQL añadirá a las posibilidades generales de consulta un ORM ligero (“lightweight Object-Relational Mapper”) capaz de gestionar la identidad de los objetos de negocio y de suministrar operaciones de actualización que se traducirán, tras las bambalinas y de manera transparente al programador, en las sentencias SQL correspondientes.


 


Como yo lo veo, con la llegada de Orcas podremos empezar a crear aplicaciones verdaderamente 100% orientadas a objetos, a trabajar a un nivel cualitativamente más alto. Por supuesto, aún queda mucho trabajo por delante, sobre todo en lo relativo a la creación de un cuerpo teórico asociado a la arquitectura de las aplicaciones basadas en LINQ; pero (creo) ya se puede vislumbrar lo que vendrá.


 


Si has leído hasta aquí este “panfleto incendiario”, solo me resta darte las gracias. Tu opinión será bienvenida.


 


 

Sobre la ‘@’, el ‘&’ y otros "escapes"

En un reciente artículo,


    http://geeks.ms/blogs/rfog/archive/2007/02/19/el-uso-on-de-la-algarroba-dentro-de-un-programa-escrito-en-c.aspx,


mi buen amigo RFOG escribía sobre la posibilidad de utilizar en C# el carácter ‘@’ como prefijo delante de una palabra reservada, para indicar que ésta debe ser tratada como un identificador “normal”. Augusto Ruiz comentaba, correctamente, que la utilidad del uso de la ‘@’ delante de las palabras reservadas radica en que permite referirse desde C# a una clase, propiedad, método, etc. creada en otro lenguaje con un nombre que coincide con el de una palabra reservada de C#. Asimismo, indicaba que en Visual Basic para lograr ese efecto se encierra la palabra reservada entre corchetes.


Me imagino que todo lenguaje .NET que se precie debe tener algún mecanismo similar, dado el énfasis que hace la plataforma en que sea posible utilizar el código escrito en otros lenguajes. Por ejemplo, en Delphi/Object Pascal .NET el papel de la ‘@’ lo juega el ‘&’.


Un ejemplo de situación en la que la existencia de estos caracteres de “escape” es, cuando menos, sumamente útil, es la que sufrí tiempo atrás y me vino a la mente cuando leí el post de Rafa. Como todo el mundo conoce, la propiedad mediante la cual se representa al destinatario del mensaje de correo en las clases System.Web.Mail.MailMessage y System.Net.Mail.MailMessage se llama “To“. Con C# y VB no hay ningún problema, pero… ¡to es una palabra reservada de Pascal! (recuerde el típico bucle for i := 1 to 10 do Console.WriteLine(i);). Pascal además no distingue mayúsculas de minúsculas, así que cada vez que en Delphi .NET se quiere especificar el destinatario de un correo electrónico, no queda más narices que escribir:


    miMensaje.&To := ‘sleepless@seattle.com’;


 

La próxima CTP de Orcas será en marzo

Según Dinesh Kulkarni, Program Manager de Visual C#, podemos esperar la próxima CTP de Orcas para el próximo marzo:


    http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1180478&SiteID=1


Dinesh confirma que en esta CTP ya estará incluida toda la funcionalidad relacionada con LINQ To SQL (tecnología anteriormente conocida como DLINQ), que permitirá utilizar las consultas integradas en el lenguaje contra bases de datos relacionales, sobre lo que no hemos visto nada nuevo desde hace algún tiempo…


 

Otra gran entrevista a Anders…

Mi viejo conocido Charlie Calvert (otro ex-Borlander) ha publicado en su blog otra entrevista a Anders Hejlsberg, arquitecto principal de C#, en la que éste habla sobre las ventajas que ofrecerá a los programadores la incorporación a C# y VB de elementos de programación funcional y de las consultas integradas en el lenguaje:



          http://blogs.msdn.com/charlie/archive/2007/01/26/anders-hejlsberg-on-linq-and-functional-programming.aspx



De esta entrevista me quedo no solo con la extraordinaria lucidez con la que Anders resume en unos pocos minutos la importancia de las funciones lambda, los árboles de expresiones o las consultas integradas en los lenguajes, sino también con la introducción preliminar de Charlie, en la que algunos encontraremos reflejada la historia de nuestras vidas.


 

Artículos sobre expresiones lambda y árboles de expresiones (C# 3.0)

Desde hace algún tiempo, vengo escribiendo para www.elguille.info algunos artículos sobre las nuevas características que incluirá C# 3.0. Por el momento hay tres, uno sobre expresiones lambda y dos sobre árboles de expresiones:

a) http://www.elguille.info/NET/futuro/firmas_octavio_ExpresionesLambda.htm

b) http://www.elguille.info/NET/futuro/firmas_octavio_ArbolesExpresiones.htm

c) http://www.elguille.info/NET/futuro/firmas_octavio_calculo_simbolico.htm

Gracias desde aquí a El Guille por la oportunidad de publicar en su sitio.