L'utilisation de la nouvelle classe System.Tuple est-elle mauvaise?

19

J'aime le concept de System.Tuple en ce qu'il me permet de retourner plusieurs paramètres en un seul appel de fonction sans instancier une nouvelle classe, mais cela défie toutes les bonnes pratiques de programmation telles que Microsoft Patterns & Practices, SOLID Principles, etc.

J'essaie juste de mesurer à quel point je devrais utiliser cette fonctionnalité de manière libérale ou si je ne devais l'utiliser que dans des scénarios de cas particuliers lorsque cela était nécessaire.

Kyle Ballard
la source
+1: Excellente question. Aussi - je me demande si Anders Hejlsberg a pesé là-dessus.
Jim G.

Réponses:

11

Le problème avec l'utilisation Tupleest que les paramètres de type génériques ne transmettent pas de sens.

Pour plus de lisibilité, vous pouvez envisager d'utiliser une classe personnalisée ou même un type anonyme avec des membres nommés.

Oded
la source
Qu'en est-il de la description des paramètres XML? Pas l'endroit le plus évident pour regarder, mais mieux que rien.
John Bubriski
@SkippyFire - Comment ça? Tout ce que vous obtenez est le type de T1, T2etc. Ne vous dit pas ce que cela signifie.
Oded
2
Je dois dire: chaque fois que j'ai (ou quelqu'un de notre équipe) utilisé un tuple comme type, je me réfère constamment à d'autres parties du code pour me souvenir de ce que sont .Item1, .Item2, etc. Pour tout ce qui n'est pas complètement trivial, créez des classes discrètes. Donnez-vous une chance à l'avenir de savoir ce que vous faisiez.
Joe
@Oded Je parle d' ajouter de la documentation XML à une méthode acceptant un tuple. Encore une fois, pas parfait, mais mieux que rien si vous voulez / devez utiliser Tuples.
John Bubriski
1
@Oded En outre, le paramètre ou la valeur de retour peut ne pas transmettre de signification, mais le nom de la méthode peut. Supposons que vous ayez une méthode appelée GetTopTwoPercentages()qui renvoie a Tuple<decimal, decimal>. Cela pourrait être assez clair.
John Bubriski
8

L'une des qualités de code les plus importantes est la lisibilité. Alors demandez-vous:
quand je (c'est-à-dire chez n'importe qui d'autre que vous) regarde la signature de la méthode, est-ce que je sais ce que signifient les composants respectifs de l' Tupleavoir?
Par exemple, si la paire de flotteurs que vous retournez est un ensemble de coordonnées polaires, est-ce clair?

C'est clair:

Tuple<Float, Float> getPolarCoords();

Ceci est trompeur (car on supposerait des coordonnées cartésiennes):

Tuple<Float, Float> getCoords();

Et cela n'a pas de sens:

Tuple<Float, Float> getTuple();

Donc, d'une manière générale, vous devrez évaluer la clarté au cas par cas et refactoriser si nécessaire. Si vous représentez le même type de données que Tupledans de nombreux endroits différents, la création d'une classe est définitivement une bonne idée.

back2dos
la source