Saat meninjau beberapa kode, saya perhatikan kesempatan untuk mengubahnya menggunakan generik. Kode (dikaburkan) terlihat seperti:
public void DoAllTheThings(Type typeOfTarget, object[] possibleTargets)
{
var someProperty = typeOfTarget.GetProperty(possibleTargets[0]);
...
}
Kode ini dapat diganti oleh obat generik, seperti:
public void DoAllTheThings<T>(object[] possibleTargets[0])
{
var someProperty = type(T).getProperty(possibleTargets[0]);
...
}
Dalam meneliti manfaat dan kekurangan dari pendekatan ini saya menemukan istilah yang disebut penyalahgunaan generik . Lihat:
- Melindungi yang belum tahu (pengembang) dari obat generik
- https://stackoverflow.com/questions/28203199/is-this-an-abuse-of-generics
- https://codereview.stackexchange.com/q/60695
Pertanyaan saya ada dua bagian:
- Adakah manfaat untuk beralih ke obat generik seperti ini? (Kinerja? Keterbacaan?)
- Apa itu Penyalahgunaan Generik? Dan apakah menggunakan generik setiap kali ada parameter tipe penyalahgunaan ?
Jawaban:
Ketika obat generik diterapkan secara tepat, mereka menghapus kode alih-alih hanya mengatur ulangnya. Terutama, kode yang paling baik dihilangkan oleh generik adalah typecasts, reflection, dan dynamic typing. Oleh karena itu penyalahgunaan generik dapat secara longgar didefinisikan sebagai membuat kode generik tanpa pengurangan signifikan dalam pengetikan, refleksi, atau pengetikan dinamis dibandingkan dengan implementasi non-generik.
Sehubungan dengan contoh Anda, saya berharap penggunaan obat generik yang tepat untuk mengubah
object[]
keT[]
atau serupa, dan menghindariType
atautype
sama sekali. Itu mungkin memerlukan refactoring yang signifikan di tempat lain, tetapi jika menggunakan obat generik sesuai dalam kasus ini, itu akan berakhir secara keseluruhan lebih sederhana ketika Anda selesai.sumber
object[]
keT[]
.Saya akan menggunakan aturan yang tidak masuk akal: Generik, seperti semua konstruksi pemrograman lainnya, ada untuk menyelesaikan masalah . Jika tidak ada masalah untuk dipecahkan untuk obat generik, menggunakannya adalah penyalahgunaan.
Dalam kasus spesifik generik, sebagian besar ada untuk abstrak dari tipe konkret, yang memungkinkan implementasi kode untuk tipe berbeda dilipat menjadi satu templat generik (atau apa pun bahasa Anda menyebutnya). Sekarang, misalkan Anda memiliki kode yang menggunakan tipe
Foo
. Anda mungkin mengganti jenis itu dengan generikT
, tetapi jika Anda hanya membutuhkan kode itu untuk bekerja dengannyaFoo
, tidak ada kode lain yang dapat Anda gunakan untuk melipatnya. Dengan demikian, tidak ada masalah yang harus dipecahkan, sehingga tipuan menambahkan generik hanya akan berfungsi untuk mengurangi keterbacaan.Akibatnya, saya sarankan untuk hanya menulis kode tanpa menggunakan obat generik, sampai Anda melihat kebutuhan untuk memperkenalkannya (karena Anda memerlukan instantiasi kedua). Kemudian, dan hanya saat itu, adalah waktu untuk memperbaiki kode untuk menggunakan obat generik. Setiap penggunaan sebelum titik itu adalah penyalahgunaan di mataku.
Ini kedengarannya agak terlalu berlebihan, jadi izinkan saya mengingatkan Anda:
Tidak ada aturan tanpa pengecualian dalam pemrograman. Aturan ini termasuk.
sumber
Kode itu terlihat aneh. Tetapi jika kita menyebutnya, terlihat lebih baik untuk menentukan jenisnya sebagai generik.
https://stackoverflow.com/questions/10955579/passing-just-a-type-as-a-parameter-in-c-sharp
Secara pribadi saya tidak suka contortions ini yang membuat kode panggilan terlihat cantik. misalnya seluruh hal yang 'lancar' dan Metode Penyuluhan.
Tetapi Anda harus mengakui bahwa ia memiliki pengikut yang populer. bahkan microsoft menggunakannya dalam kesatuan misalnya
sumber
Bagi saya sepertinya Anda berada di jalan yang benar di sini, tetapi tidak menyelesaikan pekerjaan.
Sudahkah Anda mempertimbangkan untuk mengubah
object[]
parameterFunc<T,object>[]
untuk langkah selanjutnya?sumber