Las tuplas C# son una nueva característica de C# 7. Voy a mostrar los conceptos básicos de cómo funcionan las tuplas C#. También voy a mezclar un poco de Couchbase para mostrar las tuplas en acción. Sin embargo, si no quieres instalar Couchbase sólo para jugar con tuplas, no te preocupes, podrás seguirlo.
En el código fuente que utilizo para esta entrada del blog está disponible en GitHub para que lo pruebes si quieres.
Nota: Si hace tiempo que utiliza C#, es posible que recuerde la función Clase Tuple que se introdujo en .NET 4. Esa clase sigue existiendo, pero no es lo mismo que la nueva función de tupla de C#.
¿Qué son las tuplas C#?
Una "tupla" es un concepto matemático que no es más que una lista de elementos. En la familia de lenguajes LISP, la codificación se basa casi exclusivamente en la idea de que todo es una lista. Una vez más, C# toma prestada una idea del mundo de la programación funcional y la integra en un lenguaje no funcional. Así, obtenemos las tuplas C# (echa un vistazo a la etiqueta propuesta original de tupla C# de Mads Torgersen para más detalles y antecedentes).
¿Te acuerdas de los tipos anónimos?
Pero, para simplificarlo, consideremos algo con lo que quizá ya estés familiarizado en C#, un tipo anónimo. Para repasar, puedes instanciar un nuevo objeto sin especificar un tipo:
1 |
var miObjeto = nuevo { Foo = "bar", Baz = 123 }; |
Entre bastidores, en realidad es un tipo que hereda de la base Objeto
pero, en general, sólo nos ocupamos del objeto, no de su tipo.
Además, no puedo devolver un tipo anónimo de un método, o pasar un tipo anónimo como parámetro sin perder la información de tipo en el proceso.
1 2 3 4 5 6 7 8 9 10 |
privado objeto GetAnonymousObject() { devolver nuevo {Foo = "bar", Baz = 123}; } privado void OtroMétodo() { var obj = GetAnonymousObject(); Consola.WriteLine(obj.Foo); // error del compilador :( } |
Son útiles, sin duda, pero generalmente me refiero a ellas como anónimas objetos como yo las uso, por estas razones.
¿Qué tiene esto que ver con las tuplas C#?
Pienso en las tuplas C# como una forma de hacer que C# devuelva tipos anónimos, pero con información más rica. Son una forma de crear una "clase" sobre la marcha sin definir realmente una clase. La sintaxis de las tuplas consiste simplemente en poner entre paréntesis una lista de tipos y nombres separados por comas. Un literal de tupla no es más que una lista de literales separados por comas y también rodeados de paréntesis. Por ejemplo:
1 2 3 4 |
(cadena Nombre, cadena Apellido) miTuple = ("Matt", "Arboledas"); Consola.WriteLine(miTuple.Nombre); // no hay error de compilación :) Consola.WriteLine(miTuple.Apellido); // no hay error de compilación :) |
Nota: Ahora mismo prefiero PascalCase para las propiedades de las tuplas. No sé si es la pauta oficial o no, pero a mí me "parece" correcta.
Tuplas C# en acción
He puesto a trabajar tuples en una sencilla aplicación de consola que interactúa con Couchbase.
He creado un BucketHelper
que es una fachada muy simple sobre la clase normal de Couchbase IBucket
. Esta clase tiene dos métodos: uno para obtener un documento por clave y devolver una tupla, y otro para insertar una tupla como documento.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
público clase BucketHelper { privado sólo lectura IBucket _bucket; público BucketHelper(IBucket cubo) { _bucket = cubo; } público (cadena Clave, T obj) GetTuple<T>(cadena clave) { var doc = _bucket.Visite<T>(clave); devolver (doc.Id, doc.Valor); } público void InsertTuple<T>((cadena Clave, T obj) tupla) { _bucket.Inserte(nuevo Documento<T> { Id = tupla.Clave, Contenido = tupla.obj }); } } |
Para instanciar este helper, basta con pasarle un archivo IBucket
en el constructor.
Tuple como tipo de retorno
A continuación, puede utilizar la función GetTuple
para obtener un documento de Couchbase como una tupla.
1 2 3 |
var bucketHelper = nuevo BucketHelper(cubo); (cadena clave, Película película) fightClub = bucketHelper.GetTuple<Película>("film-001"); |
La tupla constará de una cadena (la clave del documento) y un objeto del tipo que especifiques. El contenido del documento es JSON y será serializado a un objeto C# por el SDK .NET.
Además, fíjate en que el nombre de las propiedades de las tuplas no tiene por qué coincidir. Yo he utilizado obj
en BucketHelper
pero utilicé película
cuando llamé GetTuple
. Los tipos tienen que coincidir, por supuesto.
Tuple como tipo de parámetro
También puedo hacer lo contrario y pasar una tupla como parámetro a InsertTuple
.
1 2 3 |
cadena clave = Guía.NuevaGuid().ToString(); Película randomFilm = GenerarPelículaAleatoria(); bucketHelper.InsertTuple((clave, randomFilm)); |
En GenerarPelículaAleatoria
devuelve un Película
con algunos valores aleatorios (echa un vistazo al objeto Fuente GitHub para más detalles). Una tupla de (cadena, Película)
se pasa a InsertTuple
. El SDK de Couchbase .NET lo toma de ahí e inserta un documento con la clave/valor apropiado.
Ejecutando la aplicación de consola, deberías obtener una salida parecida a esta:
Ten en cuenta que el SDK .NET de Couchbase en este momento no tiene soporte directo para tuplas, y puede que nunca lo necesite. Este código es simplemente para ayudar a demostrar tuplas C#. No recomiendo usar el BucketHelper tal cual en producción.
¿TUH-ple o TOO-ple?
Creo recordar que mis profesores lo pronunciaban como "TOO-ple", así que eso es lo que yo uso. Al igual que el debate sobre la "G" dura o la "G" suave, estoy seguro de que hay quienes piensan que este debate es de suma importancia y están convencidos de que su pronunciación es la única verdadera. Pero.., ambos son aceptables.
Si tienes preguntas sobre las tuplas, estaré encantado de ayudarte. También puedes ponerte en contacto conmigo en Twitter @mgroves o envíeme un correo electrónico matthew.groves@couchbase.com.
Si tienes alguna pregunta sobre el SDK .NET de Couchbase que he utilizado en este post, no dudes en preguntar en la sección Foros de Couchbase .NET. Consulte también el Portal para desarrolladores de Couchbase para obtener más información sobre el SDK .NET y Couchbase en general.