Apakah praktik yang buruk untuk menyebutkan properti / anggota sama dengan tipe yang mendeklarasikan dalam C #?

25

Misalnya, kelas seperti:

class Dog { } //never mind that there's nothing in it...

dan kemudian properti seperti:

Dog Dog { get; set; }

Saya telah diberitahu bahwa jika saya tidak dapat menemukan nama yang lebih imajinatif untuk itu, maka saya harus menggunakan:

Dog DogObject { get; set; }

Adakah pemikiran tentang cara memberi nama ini dengan lebih baik?

Badai Kiernan
sumber
2
Persyaratan yang Anda ketahui tentang ini kelihatannya sangat mematikan, mungkin karena penegakan pedoman yang baik secara berlebihan (jangan hanya menggunakan nama jenis ketika ada nama yang lebih baik).
2
Ini bahkan tidak dapat dikompilasi dalam C # karena nama anggota tidak boleh sama dengan tipe lampiran.
Lee
3
@ Lee: Saya pikir konteksnya adalah bahwa properti itu dalam tipe lain. Misalnya Personkelas yang berisi Dogproperti yang disebutDog
goric
3
Maksudku, jika dia memang anjing, beri label seperti itu.
Thomas Eding
1
Penyorotan sintaksis IDE Anda harus membedakan jenis dan properti. Ketika Anda tidak menggunakan IDE, Anda selalu dapat melihat konteksnya.
Cyanfish

Jawaban:

22

Ini bisa menjadi praktik yang buruk, kalau bukan karena fakta bahwa sudah cukup jelas apa yang Anda bicarakan dalam kode Anda, berdasarkan konteks.

Dog = new Dog();

Yang merupakan konstruktor tipe? Yang mana objeknya? Tidak bingung OK, bagaimana dengan

Dog = Dog.Create()?

Yang mana objeknya? Yang merupakan metode pabrik statis pada tipe itu? Masih tidak bingung? Saya kira tidak.

Satu-satunya saat saya melihat ini menjadi masalah potensial adalah ketika pohon namespace menjadi cukup rumit, dan kompiler tidak dapat menemukan ambiguitas, dalam hal ini Anda berakhir dengan sesuatu seperti

Dog = new Some.Namespace.Dog();

Bagaimanapun, ini hanya boleh terjadi dengan Properti Otomatis (dan mungkin enum), karena nama variabel lokal selalu berdasarkan camel, menghindari ambiguitas sepenuhnya.

dog = new Dog();
Robert Harvey
sumber
7
+1. Dan alternatifnya semua lebih buruk: "TheDog", "AnyDog", "MyDog", dll. Ketika tidak ada yang ditambahkan, yang terbaik adalah tidak menambahkan apa pun.
kevin cline
Saya kira yang kedua bisa membingungkan jika karena alasan tertentu Dogdisebut metode instance Create, tetapi Anda akan menyelam ke dalam beberapa praktik pengkodean yang cukup mengerikan pada saat itu.
KDiTraglia
40

Tidak hanya ini praktik yang masuk akal, bahasa ini dirancang khusus untuk mengizinkan ini. Cari spesifikasi C # untuk "Warna Warna" untuk aturan dan justifikasi, dan lihat

http://blogs.msdn.com/b/ericlippert/archive/2009/07/06/color-color.aspx

untuk beberapa kasus sudut menarik yang muncul dari keputusan ini.

Dalam situasi apa pun Anda tidak boleh memberi nama properti "DogObject" untuk menghindari menyebutnya sama dengan tipenya; yang secara langsung bertentangan dengan pedoman desain kerangka kerja.

Eric Lippert
sumber
Jika jenis properti adalah properti yang instansinya tidak memiliki identitas (misalnya Color), penggunaan tersebut tampaknya masuk akal. Saya tidak begitu menyukainya, dengan bisa berubah atau IDisposabletipe. Apakah "kontrol Font" mengacu pada aspek-aspek negara yang dirangkum oleh properti, atau ke instance yang Fontdiidentifikasi oleh pengambil properti?
supercat
7

Tidak apa-apa menyebutnya Dogdan inilah sebenarnya yang direkomendasikan Microsoft dalam pedoman penamaan Kerangka :

PERTIMBANGKAN memberikan properti nama yang sama dengan tipenya.

Misalnya, properti berikut secara benar mendapatkan dan menetapkan nilai enum bernama Warna, sehingga properti tersebut bernama Warna.

Dan berikut adalah contoh yang mereka gunakan dalam panduan di atas:

public enum Color {...}
public class Control {
    public Color Color { get {...} set {...} }
}
Isak Savo
sumber