Seperti yang disebutkan dalam judul, apakah tipe bertelur (misalnya tipe atau struktur yang disebutkan dalam kelas) dianggap praktik yang buruk atau tidak? Ketika Anda menjalankan Analisis Kode di Visual Studio itu mengembalikan pesan berikut yang menyiratkan itu adalah:
Peringatan 34 CA1034: Microsoft.Design: Jangan masukkan tipe 'ClassName.StructueName'. Atau, ubah aksesibilitasnya sehingga tidak terlihat secara eksternal.
Namun, ketika saya mengikuti rekomendasi dari Analisis Kode, saya menemukan bahwa cenderung ada banyak struktur dan jenis enumerasi yang beredar di aplikasi yang mungkin hanya berlaku untuk satu kelas atau hanya akan digunakan dengan kelas itu. Dengan demikian, apakah pantas untuk bersarang jenis dosa yang terjadi, atau apakah ada cara yang lebih baik untuk melakukannya?
sumber
Jawaban:
Jenis bersarang tidak buruk. Peringatan yang Anda terima tidak menyarankan Anda tidak pernah memiliki tipe bersarang. Ini hanya menunjukkan bahwa tipe bersarang Anda harus menggunakan pengubah akses yang sesuai dan lokasi kode.
Jika tipe bersarang benar-benar hanya digunakan di dalam kelas yang berisi (yaitu itu adalah wadah data internal atau indikator status), maka atur pengubah aksesnya ke pribadi.
Jika tipe bersarang adalah bagian dari satu atau lebih tanda tangan metode, maka sebenarnya bukan lokal untuk kelas yang berisi. Ini mewakili pesan yang dikirimkan ke atau dari instance kelas yang mengandung. Dalam hal ini, mungkin lebih baik untuk memindahkan tipe bersarang dari kelas yang berisi, dan memberikan pengubah akses yang lebih terbuka seperti internal atau publik.
Singkatnya, peringatan itu tampaknya merekomendasikan agar Anda membuat tipe lokal pribadi, dan tipe bersama harus berdiri sendiri.
sumber
Jika hanya digunakan oleh kelas itu, ia harus dibuat pribadi dan itulah yang disarankan oleh pesan tersebut.
sumber
Peringatan tentang jenis bersarang adalah salah satu "saran" pertama yang saya terima beberapa waktu lalu setelah mengaktifkan Analisis Kode. Itu juga alasan mengapa saya mematikannya.
Beberapa saran benar-benar asing seolah-olah mereka datang dari planet lain.
Saya memasukkan enumerasi ke dalam kelas untuk menjaga semuanya tetap logis.
Pikirkan seperti ini: jika jenis bersarang akan menjadi kejahatan absolut dalam semua kasus, mengapa perancang bahasa telah menerapkannya di tempat pertama? Karena itu berguna dalam banyak kasus dan dalam hal itu peringatan tersebut hanyalah menunjukkan bahwa sesuatu dalam kode Anda mungkin tidak optimal. Jika itu berlaku atau tidak, itu terserah Anda untuk memutuskan.
sumber
Tidak
Contoh yang baik dalam C # adalah IEnumerable di mana kelas-kelas lain tidak perlu tahu kelas yang dikembalikannya, hanya bahwa itu adalah IEnumerator. Jadi masuk akal untuk menjadikannya kelas bersarang jika tidak, Anda mungkin memiliki banyak kelas kecil yang mengambang di intellisense yang mengimplementasikan IEnumerator
sumber
GetEnumerator()
; untuk alasan itu,List<T>.GetEnumerator()
kembaliList<T>.Enumerator()
. Jika ada beberapa cara untuk meminta kompiler untuk menggunakan beberapa metode bernama lain, mungkin lebih baik untuk memiliki metode itu misalnyaForEachGetEnumerator()
kembaliList<T>.Enumerator
danGetEnumerator()
kembaliIEnumerator<T>
, tetapi tidak ada mekanisme untuk itu.