As tuplas do C# são um novo recurso do C# 7. Vou lhe mostrar os conceitos básicos de como as tuplas do C# funcionam. Também vou misturar um pouco de Couchbase para mostrar as tuplas em ação. No entanto, se você não quiser instalar o Couchbase apenas para brincar com tuplas, não se preocupe, você ainda poderá acompanhar o processo.
O O código-fonte que usei para esta postagem do blog está disponível no GitHub para você experimentar, se quiser.
Observação: Se você estiver usando o C# há algum tempo, talvez se lembre do Classe Tuple que foi introduzida no .NET 4. Essa classe ainda existe, mas não é a mesma coisa que o novo recurso de tupla do C#.
O que são tuplas C#?
Uma "tupla" é o nome de um conceito matemático que é apenas uma lista de elementos. Na família de linguagens LISP, a codificação é construída quase que inteiramente em torno da ideia de que tudo é uma lista. Mais uma vez, o C# pega emprestado o núcleo de uma ideia do mundo da programação funcional e o integra em uma linguagem não funcional. Assim, temos as tuplas do C# (confira o Proposta original da tupla C# por Mads Torgersen para obter mais detalhes e informações básicas).
Lembra-se dos tipos anônimos?
Mas, para simplificar, vamos considerar algo com o qual você já deve estar familiarizado no C#, um tipo anônimo. Em resumo, você pode instanciar um novo objeto sem especificar um tipo:
1 |
var myObject = novo { Foo = "bar", Baz = 123 }; |
Nos bastidores, há de fato é um tipo que herda da base Objeto
mas, de modo geral, lidamos apenas com o objeto, não com seu tipo.
Além disso, não posso retornar um tipo anônimo de um método ou passar um tipo anônimo como parâmetro sem perder as informações de tipo no processo.
1 2 3 4 5 6 7 8 9 10 |
privado objeto GetAnonymousObject() { retorno novo {Foo = "bar", Baz = 123}; } privado vazio OutroMétodo() { var obj = GetAnonymousObject(); Console.WriteLine(obj.Foo); // erro do compilador :( } |
Eles são úteis, sem dúvida, mas geralmente me refiro a eles como anônimos objetos como eu as uso, por esses motivos.
O que isso tem a ver com as tuplas C#?
Penso nas tuplas do C# como uma forma de fazer com que o C# retorne tipos anônimos, mas com informações mais ricas. Elas são uma forma de criar uma "classe" em tempo real sem realmente definir uma classe. A sintaxe das tuplas consiste simplesmente em colocar parênteses em torno de uma lista de tipos e nomes separados por vírgulas. Um literal de tupla é apenas uma lista de literais separados por vírgula, também cercada por parênteses. Por exemplo:
1 2 3 4 |
(string FirstName, string Sobrenome) myTuple = ("Matt", "Groves"); Console.WriteLine(myTuple.FirstName); // nenhum erro do compilador :) Console.WriteLine(myTuple.Sobrenome); // nenhum erro do compilador :) |
Observação: No momento, estou preferindo o PascalCase para propriedades de tuplas. Não sei se essa é a diretriz oficial ou não, mas me parece correta.
Tuplas C# em ação
Coloquei as tuplas para trabalhar em um aplicativo de console simples que interage com o Couchbase.
Eu criei um Ajudante de balde
que é uma fachada muito simples sobre a classe normal do Couchbase IBucket
. Essa classe tem dois métodos: um para obter um documento por chave e retornar uma tupla, e outro para inserir uma tupla como um 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 classe Ajudante de balde { privado somente leitura IBucket _bucket; público Ajudante de balde(IBucket balde) { _bucket = balde; } público (string Chave, T obj) GetTuple<T>(string chave) { var doc = _bucket.Obter<T>(chave); retorno (doc.Id, doc.Valor); } público vazio InsertTuple<T>((string Chave, T obj) tupla) { _bucket.Inserir(novo Documento<T> { Id = tupla.Chave, Conteúdo = tupla.obj }); } } |
Para instanciar esse auxiliar, você só precisa passar um IBucket
no construtor.
Tuple como um tipo de retorno
Você pode então usar o GetTuple
para obter um documento do Couchbase como uma tupla.
1 2 3 |
var ajudante de balde = novo Ajudante de balde(balde); (string chave, Filme filme) Clube de luta = ajudante de balde.GetTuple<Filme>("film-001"); |
A tupla consistirá em uma cadeia de caracteres (a chave do documento) e um objeto de qualquer tipo que você especificar. O conteúdo do documento é JSON e será serializado em um objeto C# pelo SDK do .NET.
Além disso, observe que o nome das propriedades da tupla não precisa ser igual. Eu usei obj
em Ajudante de balde
mas eu usei filme
quando liguei para GetTuple
. Os tipos precisam corresponder, é claro.
Tuple como um tipo de parâmetro
Também posso fazer o caminho inverso e passar uma tupla como parâmetro para InsertTuple
.
1 2 3 |
string chave = Guia.NovoGuia().ToString(); Filme randomFilm = Gerar filme aleatório(); ajudante de balde.InsertTuple((chave, randomFilm)); |
O Gerar filme aleatório
retorna um Filme
com alguns valores aleatórios (confira o Fonte do GitHub para obter detalhes). Uma tupla de (string, filme)
é passado para InsertTuple
. O SDK do Couchbase .NET faz isso e insere um documento com a chave/valor apropriado.
Ao executar o aplicativo do console, você deve obter um resultado parecido com este:
Observe que, no momento, o SDK do Couchbase .NET não tem nenhum suporte direto a tuplas e talvez nunca precise dele. Esse código serve apenas para ajudar a demonstrar as tuplas C#. Eu não recomendaria o uso do BucketHelper como está na produção.
TUH-ple ou TOO-ple?
Parece que me lembro de meu(s) professor(es) pronunciando-o como "TOO-ple", então é isso que eu uso. Assim como o debate hard-G / soft-G de "GIF", tenho certeza de que há pessoas que acham que esse debate é da maior importância e estão convencidas de que sua pronúncia é a única verdadeira. Mas, ambos são aceitáveis.
Se você tiver dúvidas sobre tuplas, terei prazer em ajudar. Você também pode entrar em contato comigo em Twitter @mgroves ou envie-me um e-mail matthew.groves@couchbase.com.
Se você tiver dúvidas sobre o SDK do Couchbase .NET que usei nesta postagem, pergunte na seção Fóruns do Couchbase .NET. Confira também o Portal do desenvolvedor do Couchbase para obter mais informações sobre o .NET SDK e o Couchbase em geral.