Saya memutuskan untuk mengajukan pertanyaan ini di sini alih-alih di stack overflow karena agak subyektif.
Dalam C #, biasanya saya melihat tipe generik dengan nama yang sangat buruk. Secara khusus, "T" umumnya digunakan tetapi bukan nama yang bermakna dengan sendirinya. Sebagai contoh:
class Fruit<T>
{
T fruit;
}
Meskipun ini adalah pendekatan yang umum, adakah yang akan merekomendasikan hal ini? Dan jika demikian, apa konvensi penamaan yang masuk akal untuk tipe generik dalam konteks C # untuk fungsi dan kelas generik?
Dalam contoh saya sebelumnya, mari kita asumsikan bahwa jenis generik T
harus selalu menjadi jenis buah, seperti Apple
atau Orange
. Jenisnya T
perlu memperjelas bahwa itu adalah jenis buah, jadi mungkin nama yang lebih baik FruitType
, jadi kita berakhir dengan:
class Fruit<FruitType>
{
FruitType fruit;
}
Ini hanya untuk memberi kalian ide tentang apa yang saya cari. Apa "aturan praktis" yang dapat diterima untuk masalah ini?
Jawaban:
Sungguh subyektif ... ish .
Karena beberapa orang menemukan
i
itu benar-benar valid untuk variabel loop, beberapa orang berpikirT
sangat valid untuk tipe place-holder di kelas generik.Saya pribadi mendukung pendekatan ini, itu adalah konvensi umum dan orang-orang umumnya tahu apa yang Anda maksud.
Di mana jenisnya bermakna saya akan menggunakan nama yang bermakna, tetapi umumnya memulainya dengan T. Saya baru-baru ini mengembangkan kelas kamus umum (jangan tanya) dan deklarasi itu
Namun, untuk sesuatu seperti Tuple, di mana jenis-jenisnya pada dasarnya tidak berarti, saya menganggap yang berikut ini benar-benar dapat diterima.
sumber
i
danT
bekerja, dan ini pada prinsipnya dapat diukur (yaitu dapat diukur apakah pemahaman kode sumber meningkat jika, katakanlah, indeks loop mendapatkan pengidentifikasi yang berbeda). Hanya karena sulit untuk mengukur bukan berarti kita harus memberi label "subyektif" pada semuanya. Mengingat penggunaannya yang luas tanpa masalah yang jelas, cukup masuk akal untuk mengatakan bahkan tanpa mengukur bahwa ini memang bekerja.i
danT
itu jahat . Orang tidak boleh menggunakan nama huruf tunggal" ketik jawaban. Telah menambahkan ish untuk membantu memuaskan semua orang :)T
masuk akal ketika kita berbicara tentang jenis tanpa kendala,TFruit
masuk akal karena ia berkata kepada saya "Setiap jenis dengan kendala bahwa itu adalah buah". Ini sepertinya "aturan praktis" yang bagus untuk penamaan parameter tipe generik. Terima kasih!!Saya pikir Anda benar, meskipun T telah menjadi standar. Mungkin berasal dari waktu C ++ lama dan kata-kata "dari tipe T". Saya menganggap itu praktik yang baik untuk menjadi deskriptif mungkin, tapi itu subjektif.
Anda dapat memilih T sebagai awalan, seperti halnya banyak orang memilih I untuk antarmuka. Jadi
akan menjadi nama baik menurut pendapat saya. Saya lebih suka awalan daripada sufiks dalam banyak kasus, karena dengan segera jelas apa yang Anda lihat ketika Anda menemukannya dan lebih mudah untuk mencari hal-hal seperti Intellisense. Ini adalah praktik yang baik untuk Kontrol-UI, juga, ketika Anda kemungkinan besar selalu tahu jenisnya (mis. TextBox) tetapi tidak 100% yakin tentang nama deskriptif yang Anda berikan.
Sisi negatifnya adalah, terlihat buruk ketika tipe itu sendiri dimulai dengan T. Jadi saya pikir akan lebih baik jika suffix tipe generik dalam kasus khusus, seperti yang di bawah ini.
Harap dicatat bahwa ini hanya pendapat saya dan sangat subjektif. Tapi saya pikir saya punya poin kecil dengan lebih memilih awalan daripada suffixing.
sumber
T
awalan untuk parameter tipe danI
untuk nama antarmuka diwajibkan secara eksplisit ( aturan " DO ...") dalam Pedoman Desain Kerangka.TFruit
sini membawa ke atas mejaT
. Menggunakan nama sepertiTType
atauTypeT
tentu saja tidak masuk akal. Itu tidak menambahkan informasi apa pun selain hanyaT
. Informasi yang sama persis disampaikan.Microsoft memiliki pedoman resmi tentang obat generik: Nama Kelas, Struktur, dan Antarmuka (dikutip di sini , dan dalam bentuk buku: Kerangka Desain Pedoman ).
Mengenai pertanyaan spesifik Anda dikatakan:
sumber
Inti dari generik adalah mendelegasikan fungsionalitas - kelas generik melakukan satu hal, argumennya melakukan hal lain. Contoh buku teks adalah koleksi generik: koleksi menyimpan 'barang', tetapi tidak peduli benda apa itu. Nama generik (sic!), Dengan demikian, memiliki logika tertentu untuk itu - kami tidak ingin itu menjadi deskriptif, karena tidak ada yang bisa dijelaskan selain "itu argumen tipe generik", yang
T
mencakup namanya secara mendalam (mempertimbangkan konvensi). Menjadi deskriptif itu baik, tetapi terlalu deskriptif menunjukkan batasan yang tidak ada.Namun, kadang-kadang, kelas atau metode generik memiliki lebih dari satu jenis parameter, dan pada titik ini, masuk akal untuk memberi mereka lebih banyak nama deskriptif, sehingga peran mereka menjadi jelas. Contoh yang baik adalah untuk jenis pengumpulan nilai-kunci, di mana kunci dan nilai bersifat generik; memanggil mereka
T
danS
(atauQ
apa pun) akan kurang berguna daripada memanggil mereka, katakan,KeyType
danValueType
, atauTKey
danTVal
.sumber
Jawabannya memang subyektif. Namun, itu memang pantas sebagai pertanyaan, karena kode harus mendokumentasikan sendiri, dan kita semua bisa belajar beberapa cara yang lebih baik untuk melakukannya.
Berikut ini adalah konvensi yang saya pelajari dan ikuti:
Parameter tipe generik tidak boleh keliru untuk kelas beton. Ini umumnya mendorong pengantar
T
terlepas dari apa pun yang mengikuti, seperti antarmuka umumnya diawali denganI
.Parameter tipe generik tunggal pada kelas atau metode biasanya harus diberi label
T
. Ini adalah konvensi yang hampir dipahami secara universal sejak Templat C ++.Beberapa parameter tipe generik pada deklarasi metode atau kelas yang sama semuanya harus dimulai dengan T, tetapi dibedakan dengan beberapa cara yang ringkas namun dapat dimengerti.
TIn
danTOut
, misalnya, adalah GTP yang umum dan dipahami dengan baik untuk metode yang menerima input generik yang sangat diketik dan menghasilkan output generik yang sangat diketik.Beberapa tipe yang berbeda tetapi tidak biasa, seperti untuk kelas yang berisi seperti Tuple .Net atau tipe delegasi seperti Func, Predicate, dan Action, dapat diberi label T1, T2, T3, dll. Namun, deklarasi GTP "luar biasa" (memiliki tujuan dan tujuan yang pasti / atau batasan jenis yang sangat spesifik) harus memiliki sesuatu yang lebih deskriptif.
Tipe generik tunggal pada suatu metode, yang berbeda dari tipe generik dari kelas yang berisi, dapat mengikuti aturan sebelumnya mengenai beberapa tipe dalam kelas atau metode, ATAU jika tipe tidak biasa selain berbeda maka dapat diberikan perbedaan satu huruf, sering
U
atauV
. Sekali lagi ini adalah konvensi yang berasal dari templat C ++.Apa pun yang Anda pilih untuk dilakukan, tetap konsisten; jangan memberi label GTP untuk satu kelas
T
, dan yang berikutnyaTParam
, kecuali kelas kedua bersarang di kelas pertama sehinggaT
tidak tersedia untuk digunakan di kelas kedua.sumber