Czy korzystanie z nowej klasy System.Tuple jest złe?

19

Podoba mi się koncepcja System.Tuple, ponieważ pozwala mi zwracać wiele parametrów w jednym wywołaniu funkcji bez tworzenia nowej klasy, jednak nie podważa to żadnych dobrych praktyk programistycznych, takich jak Wzorce i praktyki Microsoft, Zasady SOLID itp.

Próbuję tylko ocenić, jak swobodnie powinienem korzystać z tej funkcji lub czy powinienem jej używać tylko w razie potrzeby w scenariuszach typu edge case.

Kyle Ballard
źródło
+1: doskonałe pytanie. Także - zastanawiam się, czy Anders Hejlsberg się w to zastanowił.
Jim G.

Odpowiedzi:

11

Problem z używaniem Tuplepolega na tym, że ogólne parametry typu nie przekazują znaczenia.

Dla czytelności możesz rozważyć użycie niestandardowej klasy lub nawet anonimowego typu z nazwanymi członkami.

Oded
źródło
Co z opisem parametru XML? Nie jest to najbardziej oczywiste miejsce do patrzenia, ale lepsze niż nic.
John Bubriski,
@SkippyFire - Co masz na myśli? Wszystko masz to typ T1, T2itd. Nie powiem ci, co mają na myśli.
Oded
2
Muszę powiedzieć: za każdym razem, gdy ja (lub ktoś z naszego zespołu) użyłem krotki jako typu, stale odwołuję się do innych części kodu, aby pamiętać, czym są .Item1, .Item2 itp. Dla wszystkiego, co nie jest całkowicie trywialne, utwórz dyskretne klasy. Daj sobie szansę w przyszłości, aby dowiedzieć się, co robisz.
Joe
@Oded Mówię o dodaniu dokumentacji XML do metody akceptowania krotki. Ponownie, nie idealny, ale lepszy niż nic, jeśli chcesz / musisz użyć Tuples.
John Bubriski,
1
@Oded Ponadto parametr lub wartość zwracana może nie przekazywać znaczenia, ale nazwa metody może. Powiedzmy, że masz metodę o nazwie, GetTopTwoPercentages()która zwraca a Tuple<decimal, decimal>. To może być dość jasne.
John Bubriski,
8

Jedną z najważniejszych cech kodu jest czytelność. Więc zadaj sobie pytanie:
kiedy ja (tj. W kimkolwiek innym niż ty) patrzę na sygnaturę metody, czy wiem, jakie znaczenie mają odpowiednie elementy Tuple?
Na przykład, jeśli zwracana para pływaków jest zbiorem współrzędnych biegunowych, czy jest to jasne?

To jasne:

Tuple<Float, Float> getPolarCoords();

Jest to mylące (ponieważ zakłada się współrzędne kartezjańskie):

Tuple<Float, Float> getCoords();

A to pozbawione jest znaczenia:

Tuple<Float, Float> getTuple();

Ogólnie rzecz biorąc, będziesz musiał oceniać jasność na podstawie poszczególnych przypadków i refaktoryzować, jeśli to konieczne. Jeśli reprezentujesz ten sam rodzaj danych, co Tuplew wielu różnych miejscach, utworzenie klasy jest zdecydowanie dobrym pomysłem.

back2dos
źródło