Verwendet die neue System.Tuple-Klasse ein schlechtes Design?


19

Das Konzept von System.Tuple gefällt mir insofern, als es mir ermöglicht, mehrere Parameter in einem einzigen Funktionsaufruf zurückzugeben, ohne eine neue Klasse zu instanziieren. Dies widerspricht jedoch guten Programmierpraktiken wie Microsoft Patterns & Practices, SOLID Principles usw.

Ich versuche nur zu beurteilen, wie großzügig ich diese Funktion verwenden sollte oder ob ich sie nur in Randfallszenarien verwenden sollte, wenn dies erforderlich ist.


+1: Ausgezeichnete Frage. Also - ich frage mich, ob Anders Hejlsberg das abgewogen hat.
Jim G.

Antworten:


11

Das Problem bei der Verwendung Tupleist, dass die generischen Typparameter keine Bedeutung vermitteln.

Zur besseren Lesbarkeit können Sie eine benutzerdefinierte Klasse oder sogar einen anonymen Typ mit benannten Mitgliedern verwenden.


Was ist mit der Beschreibung der XML-Parameter? Nicht der naheliegendste Ort zum Anschauen, aber besser als nichts.
John Bubriski

@SkippyFire - Wie meinst du das? Alles , was Sie bekommen , ist die Art von T1, T2usw. Was Sie nicht sagen , was sie bedeuten.
Oded

2
Ich muss sagen: Jedes Mal, wenn ich (oder jemand aus unserem Team) einen Tupel als Typ verwendet habe, verweise ich ständig auf andere Teile im Code, um mich daran zu erinnern, was .Item1, .Item2 usw. sind. Erstellen Sie für alles, was nicht ganz trivial ist, diskrete Klassen. Geben Sie sich in Zukunft die Chance, zu wissen, was Sie getan haben.
Joe

@Oded Ich spreche über das Hinzufügen von XML-Dokumentation zu einer Methode, die ein Tupel akzeptiert. Auch dies ist nicht perfekt, aber besser als gar nichts, wenn Sie Tuples verwenden möchten / müssen.
John Bubriski

1
@Oded Auch der Parameter oder der Rückgabewert kann möglicherweise keine Bedeutung vermitteln, der Name der Methode jedoch. Angenommen, Sie haben eine Methode namens GetTopTwoPercentages()a Tuple<decimal, decimal>. Das könnte klar genug sein.
John Bubriski

8

Eine der wichtigsten Codequalitäten ist die Lesbarkeit. Fragen Sie sich also:
Wenn ich (dh jemand anders als Sie) die Methodensignatur betrachte, weiß ich, welche Bedeutung die jeweiligen Komponenten der Tuplehaben?
Wenn es sich bei dem zurückgegebenen Float-Paar beispielsweise um einen Satz von Polarkoordinaten handelt, ist dies klar?

Das ist klar:

Tuple<Float, Float> getPolarCoords();

Dies ist irreführend (weil man kartesische Koordinaten annehmen würde):

Tuple<Float, Float> getCoords();

Und das ist sinnlos:

Tuple<Float, Float> getTuple();

Im Allgemeinen haben Sie also die Möglichkeit, die Klarheit auf Einzelfallbasis zu bewerten und gegebenenfalls zu überarbeiten. Wenn Sie die gleichen Daten wie Tuplean vielen anderen Orten darstellen, ist das Erstellen einer Klasse auf jeden Fall eine gute Idee.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.