Sta usando il nuovo design System.Tuple class design?


19

Mi piace il concetto di System.Tuple in quanto mi consente di restituire più parametri in una singola chiamata di funzione senza creare un'istanza di una nuova classe, tuttavia ciò sfugge a qualsiasi buona pratica di programmazione come Microsoft Patterns & Practices, SOLID Principles, ecc.

Sto solo cercando di valutare in che misura dovrei usare questa funzionalità o se dovrei usarla solo in scenari limite se necessario.


+1: domanda eccellente. Inoltre, mi chiedo se Anders Hejlsberg abbia tenuto conto di ciò.
Jim G.

Risposte:


11

Il problema con l'utilizzo Tupleè che i parametri di tipo generico non trasmettono significato.

Per motivi di leggibilità, potresti prendere in considerazione l'utilizzo di una classe personalizzata o persino di un tipo anonimo con membri denominati.


Che dire della descrizione del parametro XML? Non è il posto più ovvio in cui cercare, ma meglio di niente.
John Bubriski,

@SkippyFire - Come intendi? Tutto quello che ottieni è il tipo di T1, T2ecc. Non ti dice cosa significano.
Oded,

2
Devo dire: ogni volta che io (o qualcuno del nostro team) abbiamo usato una Tupla come tipo, mi riferisco costantemente ad altre parti del codice per ricordare cosa sono .Item1, .Item2, ecc. Per tutto ciò che non è del tutto banale, crea classi discrete. Datti una possibilità in futuro di sapere cosa stavi facendo.
Joe,

@Oded Sto parlando di aggiungere documentazione XML a un metodo che accetta una Tupla. Ancora una volta, non perfetto, ma meglio di niente se vuoi / hai bisogno di usare Tuple.
John Bubriski,

1
@Oded Inoltre, il parametro o il valore restituito potrebbero non trasmettere significato, ma il nome del metodo può. Supponiamo che tu abbia un metodo chiamato GetTopTwoPercentages()che restituisce a Tuple<decimal, decimal>. Questo potrebbe essere abbastanza chiaro.
John Bubriski l'

8

Una delle più importanti qualità del codice è la leggibilità. Quindi chiediti:
quando io (cioè in qualcun altro tranne te) guardo la firma del metodo, so quale significato hanno i rispettivi componenti Tupledell'elemento?
Ad esempio, se la coppia di galleggianti che stai restituendo è un insieme di coordinate polari, è chiaro?

Questo è chiaro:

Tuple<Float, Float> getPolarCoords();

Questo è fuorviante (perché si potrebbero assumere coordinate cartesiane):

Tuple<Float, Float> getCoords();

E questo è privo di significato:

Tuple<Float, Float> getTuple();

Quindi, in generale, dovrai valutare la chiarezza in base al caso e refactoring se necessario. Se rappresenti lo stesso tipo di dati Tuplein molti luoghi diversi, creare una classe è sicuramente una buona idea.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.