¿Está usando el nuevo diseño System.Tuple class bad?

19

Me gusta el concepto de System.Tuple porque me permite devolver múltiples parámetros en una sola llamada de función sin instanciar una nueva clase, sin embargo, esto desafía cualquier buena práctica de programación como Microsoft Patterns & Practices, SOLID Principles, etc.

Solo estoy tratando de evaluar cuán liberalmente debería usar esta función o si solo debería usarla en escenarios de caso límite cuando sea necesario.

Kyle Ballard
fuente
+1: excelente pregunta. Además, me pregunto si Anders Hejlsberg ha intervenido en esto.
Jim G.

Respuestas:

11

El problema con el uso Tuplees que los parámetros de tipo genérico no transmiten significado.

Para facilitar la lectura, puede considerar usar una clase personalizada o incluso un tipo anónimo con miembros nombrados.

Oded
fuente
¿Qué pasa con la descripción del parámetro XML? No es el lugar más obvio para buscar, pero mejor que nada.
John Bubriski
@SkippyFire - ¿Qué quieres decir? Todo lo que obtienes es el tipo de T1, T2etc. No te dice lo que significan.
Oded
2
Tengo que decir: cada vez que yo (o alguien de nuestro equipo) ha usado una Tupla como tipo, me refiero constantemente a otras partes del código para recordar qué son .Item1, .Item2, etc. Para cualquier cosa que no sea completamente trivial, cree clases discretas. Date una oportunidad en el futuro para saber lo que estabas haciendo.
Joe
@Oded Estoy hablando de agregar documentación XML a un método que acepte una Tupla. Nuevamente, no es perfecto, pero mejor que nada si quieres / necesitas usar Tuples.
John Bubriski
1
@Oded También, el parámetro o el valor de retorno pueden no transmitir significado, pero el nombre del método sí. Digamos que tiene un método llamado GetTopTwoPercentages()que devuelve a Tuple<decimal, decimal>. Eso podría ser lo suficientemente claro.
John Bubriski
8

Una de las cualidades de código más importantes es la legibilidad. Entonces pregúntese:
cuando yo (es decir, en cualquier otra persona que no sea usted) mire la firma del método, ¿sé qué significan los componentes respectivos de la Tuple?
Por ejemplo, si el par de flotadores que está devolviendo es un conjunto de coordenadas polares, ¿está claro?

Esto está claro:

Tuple<Float, Float> getPolarCoords();

Esto es engañoso (porque uno asumiría coordenadas cartesianas):

Tuple<Float, Float> getCoords();

Y esto carece de significado:

Tuple<Float, Float> getTuple();

En términos generales, tendrá que evaluar la claridad según el caso y refactorizar si es necesario. Si representa el mismo tipo de datos que Tupleen muchos lugares diferentes, crear una clase es definitivamente una buena idea.

back2dos
fuente