Está usando o novo design incorreto da classe System.Tuple?


19

Gosto do conceito de System.Tuple, pois permite retornar vários parâmetros em uma única chamada de função sem instanciar uma nova classe; no entanto, isso desafia as boas práticas de programação, como Microsoft Patterns & Practices, SOLID Principles, etc.

Estou apenas tentando avaliar com que liberalidade devo usar esse recurso ou se devo usá-lo apenas em cenários extremos quando necessário.


+1: excelente pergunta. Além disso - eu me pergunto se Anders Hejlsberg pesou sobre isso.
Jim G.

Respostas:


11

O problema com o uso Tupleé que os parâmetros de tipo genérico não transmitem significado.

Para facilitar a leitura, considere usar uma classe personalizada ou mesmo um tipo anônimo com membros nomeados.


E a descrição do parâmetro XML? Não é o lugar mais óbvio para se olhar, mas é melhor que nada.
John Bubriski

@ SkippyFire - Como assim? Tudo que você recebe é o tipo de T1, T2etc. Não diz o que eles significam.
Oded

2
Devo dizer: toda vez que eu (ou alguém da nossa equipe) usa uma Tupla como um tipo, estou constantemente consultando outras partes do código para lembrar o que são .Item1, .Item2, etc. Para qualquer coisa que não seja completamente trivial, crie classes discretas. Dê a si mesmo uma chance no futuro de saber o que você estava fazendo.
Joe

@Oded Estou falando sobre adicionar documentação XML a um método que aceita uma tupla. Novamente, não é perfeito, mas é melhor que nada se você quiser / precisar usar Tuplas.
John Bubriski

1
@Oded Além disso, o parâmetro ou o valor de retorno pode não transmitir significado, mas o nome do método pode. Digamos que você tenha um método chamado GetTopTwoPercentages()que retorna a Tuple<decimal, decimal>. Isso pode estar claro o suficiente.
31719 John John Briski

8

Uma das qualidades de código mais importantes é a legibilidade. Então, pergunte a si mesmo:
quando eu (ou seja, em qualquer outra pessoa além de você) olhar para a assinatura do método, sei o significado dos respectivos componentes do Tuple?
Por exemplo, se o par de carros alegóricos que você está retornando é um conjunto de coordenadas polares, isso está claro?

Isto está claro:

Tuple<Float, Float> getPolarCoords();

Isso é enganoso (porque seria assumido coordenadas cartesianas):

Tuple<Float, Float> getCoords();

E este é um significado desprovido:

Tuple<Float, Float> getTuple();

De modo geral, você avaliará a clareza caso a caso e refatorará, se necessário. Se você representa o mesmo tipo de dados que Tupleem muitos lugares diferentes, criar uma classe é definitivamente uma boa ideia.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.