Apakah tipe bertelur dianggap praktik buruk?

8

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?

rjzii
sumber
Pertanyaan ini SANGAT berkaitan erat dengan programmer.stackexchange.com/questions/34067 Saya bingung apakah akan menutup ini sebagai duplikat ...
Walter
@Walter - Mereka dekat tapi saya pernah mendengar pertanyaan yang muncul secara terpisah untuk kelas bersarang di kelas dan bersarang semua jenis lainnya di kelas secara terpisah sehingga tidak ada salahnya. Ternyata, saya tidak menemukan pertanyaan itu ketika saya melakukan pencarian saya awalnya.
rjzii

Jawaban:

15

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.

JeremyDill
sumber
Pengubah internal adalah apa yang telah saya lakukan dalam banyak kasus, membersihkan sedikit, tetapi ada banyak dari mereka melayang di dalam aplikasi.
rjzii
1

Jika hanya digunakan oleh kelas itu, ia harus dibuat pribadi dan itulah yang disarankan oleh pesan tersebut.

Otávio Décio
sumber
Dalam beberapa kasus yang dilakukan, tetapi dalam kasus lain tipe enumerasi sedang digunakan dalam panggilan metode yang dilampirkan ke kelas. Demikian juga, saya juga melihat struktur yang digunakan untuk kelas metode jika jumlah parameter melebihi angka yang diberikan.
rjzii
0

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
2
Namespace harus menjadi pengelompokan logis Anda untuk enum; bukan kelas
Aaron McIver
1
Ya, dalam beberapa situasi saya merasa tidak nyaman.
Jika Anda saat ini menempatkan enum di dalam kelas, memindahkannya di luar kelas sehingga ia berada di dalam namespace mengambil semua CTRL + X ditambah dengan CTRL + V ... tidak yakin bagaimana itu akan menjadi tidak nyaman?
Aaron McIver
Saya terkadang memasukkan enum ke dalam kelas. Saya pikir ada alasan yang sah untuk itu - itu bukan aturan yang ketat.
Tidak seorang pun
3
@ rmx Saya tidak pernah menggunakan enum dalam satu kelas; itu selalu digunakan dalam beberapa kelas, jadi mendefinisikannya dalam namespace sebagai entitasnya sendiri jauh lebih masuk akal.
Aaron McIver
0

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

Homde
sumber
Dalam beberapa kasus, efisiensi run-time dapat ditingkatkan jika kompiler mengetahui tipe yang dikembalikan oleh GetEnumerator(); untuk alasan itu, List<T>.GetEnumerator()kembali List<T>.Enumerator(). Jika ada beberapa cara untuk meminta kompiler untuk menggunakan beberapa metode bernama lain, mungkin lebih baik untuk memiliki metode itu misalnya ForEachGetEnumerator()kembali List<T>.Enumeratordan GetEnumerator()kembali IEnumerator<T>, tetapi tidak ada mekanisme untuk itu.
supercat