Apakah menggunakan desain buruk System.Tuple kelas yang baru?

19

Saya suka konsep System.Tuple yang memungkinkan saya untuk mengembalikan beberapa parameter dalam satu panggilan fungsi tanpa membuat instance kelas baru, namun apakah ini menentang praktik pemrograman yang baik seperti Pola & Praktek Microsoft, Prinsip SOLID, dll.

Saya hanya mencoba mengukur seberapa bebas saya harus menggunakan fitur ini atau jika saya hanya menggunakannya dalam skenario tepi jika diperlukan.

Kyle Ballard
sumber
+1: Pertanyaan luar biasa. Juga - Saya ingin tahu apakah Anders Hejlsberg telah membebani ini.
Jim G.

Jawaban:

11

Masalah dengan penggunaan Tupleadalah bahwa parameter tipe generik tidak menyampaikan makna.

Agar mudah dibaca, Anda mungkin ingin mempertimbangkan untuk menggunakan kelas khusus atau bahkan tipe anonim dengan anggota yang disebutkan.

Oded
sumber
Bagaimana dengan deskripsi parameter XML? Bukan tempat yang paling jelas untuk dilihat, tetapi lebih baik daripada tidak sama sekali.
John Bubriski
@ SkippyFire - Bagaimana maksud Anda? Yang Anda dapatkan hanyalah tipe T1, T2dll. Tidak memberi tahu Anda apa artinya.
Oded
2
Saya harus mengatakan: setiap kali saya (atau seseorang di tim kami) telah menggunakan Tuple sebagai tipe, saya selalu merujuk kembali ke bagian lain dalam kode untuk mengingat apa. Item 1,. Item 2, dll. Untuk apa pun yang tidak sepenuhnya sepele, buat kelas diskrit. Beri diri Anda kesempatan di masa depan untuk mengetahui apa yang sedang Anda lakukan.
Joe
@Oded Saya sedang berbicara tentang menambahkan dokumentasi XML ke metode menerima Tuple. Sekali lagi, tidak sempurna, tetapi lebih baik daripada tidak sama sekali jika Anda ingin / perlu menggunakan Tuples.
John Bubriski
1
@Oded Juga, parameter atau nilai kembali mungkin tidak menyampaikan makna, tetapi nama metode bisa. Katakanlah Anda memiliki metode yang disebut GetTopTwoPercentages()yang mengembalikan a Tuple<decimal, decimal>. Itu mungkin cukup jelas.
John Bubriski
8

Salah satu kualitas kode yang paling penting adalah keterbacaan. Jadi tanyakan pada diri sendiri:
Ketika saya (yaitu orang lain selain Anda) melihat metode tanda tangan, apakah saya tahu apa artinya masing-masing komponen Tuplemiliki?
Misalnya jika pasangan pelampung yang Anda kembalikan adalah seperangkat koordinat kutub, apakah ini jelas?

Ini jelas:

Tuple<Float, Float> getPolarCoords();

Ini menyesatkan (karena orang akan menganggap koordinat Cartesian):

Tuple<Float, Float> getCoords();

Dan ini tanpa arti:

Tuple<Float, Float> getTuple();

Jadi secara umum, Anda akan mengevaluasi kejelasan atas dasar per kasus dan refactor jika perlu. Jika Anda mewakili jenis data yang sama seperti Tupledi banyak tempat berbeda, maka membuat kelas pasti merupakan ide yang bagus.

back2dos
sumber