Konvensi Penamaan Enum - Jamak

267

Saya mengajukan pertanyaan ini meskipun telah membaca yang serupa tetapi tidak persis apa yang saya inginkan di konvensi penamaan C # untuk enum dan properti yang cocok

Saya menemukan bahwa saya memiliki kecenderungan untuk menyebut enum dalam bentuk jamak dan kemudian 'menggunakannya' sebagai singular, contoh:

public enum EntityTypes {
  Type1, Type2
}

public class SomeClass {
  /*
    some codes
  */

  public EntityTypes EntityType {get; set;}

}

Tentu saja itu berhasil dan ini adalah gaya saya, tetapi adakah yang bisa menemukan masalah potensial dengan konvensi semacam itu? Saya memiliki nama "jelek" dengan kata "Status":

public enum OrderStatuses {
  Pending, Fulfilled, Error, Blah, Blah
}

public class SomeClass {
  /*
    some codes
  */

  public OrderStatuses OrderStatus {get; set;}

}

Info Tambahan: Mungkin pertanyaan saya tidak cukup jelas. Saya sering harus berpikir keras ketika menyebutkan variabel dari tipe enum yang saya tentukan. Saya tahu praktik terbaik, tetapi itu tidak membantu untuk memudahkan pekerjaan saya memberi nama variabel-variabel itu.

Saya tidak mungkin mengekspos semua properti enum saya (katakan "Status") sebagai "MyStatus".

Pertanyaan saya: Adakah yang bisa menemukan masalah potensial dengan konvensi saya yang dijelaskan di atas? Ini BUKAN tentang praktik terbaik.

Ulangi pertanyaan:

Nah, saya kira saya harus mengajukan pertanyaan seperti ini: Dapatkah seseorang keluar cara generik yang baik untuk penamaan tipe enum sehingga ketika digunakan, penamaan enum 'instance' akan sangat mudah?

baik w
sumber
5
public enum OrderState ... - publik OrderState OrderStatus {get; set;}
Fraser

Jawaban:

333

Microsoft merekomendasikan untuk menggunakan singular untuk Enums kecuali Enummewakili bidang bit (gunakan FlagsAttributejuga). Lihat Konvensi Penamaan Jenis Pencacahan (bagian dari Pedoman Penamaan Microsoft ).

Untuk menanggapi klarifikasi Anda, saya melihat tidak ada yang salah dengan salah satu dari berikut ini:

public enum OrderStatus { Pending, Fulfilled, Error };

public class SomeClass { 
    public OrderStatus OrderStatus { get; set; }
}

atau

public enum OrderStatus { Pending, Fulfilled, Error };

public class SomeClass {
    public OrderStatus Status { get; set; }
}
jason
sumber
20
Ya, ini jawaban yang benar. Garis pedoman ini digunakan dalam .Net Framework misalnya enum DayOfWeek dan flag enum RegexOptions.
Alexander Zwitbaum
1
Ya, ini adalah latihan yang disarankan, saya menyambutnya. Namun itu tidak menjawab pertanyaan saya.
okw
1
@okw untuk menjelaskan lebih lanjut, meskipun terlihat jelek, jika Anda memerlukan nilai tunggal dari flag enum gunakan bentuk singular untuk bidang / properti / argumen. Jika Anda mendukungnya menetapkan beberapa flag, gunakan jamak. Jika enum Anda bukan flag enum, gunakan singular untuk nama jenis dan bidang / properti / argumen.
Jonathan Dickinson
4
Berikut adalah tautan ke versi .Net 4.0 dari panduan konvensi penamaan Microsoft yang ditautkan dalam jawabannya.
1
@ Thomas Saya tidak pernah punya masalah dengan itu, saya tidak bisa melihat mengapa itu tidak bekerja - tidak melihat konteks di mana itu akan menjadi ambigu apakah itu tipe atau variabel yang direferensikan. yaitu OrderStatus == OrderStatus.Pendingdiakui sebagai variabel untuk kiri dan kemudian enumerasi di sebelah kanan
James Hurley
39

Saya mulai memberi nama enum dalam bentuk jamak tetapi sejak itu berubah menjadi tunggal. Sepertinya lebih masuk akal dalam konteks di mana mereka digunakan.

enum Status { Unknown = 0, Incomplete, Ready }

Status myStatus = Status.Ready;

Dibandingkan dengan:

Statuses myStatus = Statuses.Ready;

Saya menemukan bentuk tunggal terdengar lebih alami dalam konteks. Kami sepakat bahwa ketika mendeklarasikan enum, yang terjadi di satu tempat, kami berpikir "ini adalah kelompok barang apa pun", tetapi ketika menggunakannya, mungkin di banyak tempat, bahwa kami berpikir "ini adalah apa pun" .

Bob Kaufman
sumber
6
Sedikit reaksi terlambat (dan mungkin sedikit di luar topik) tetapi: saya akan menyarankan menggunakan nilai 0untuk nilai yang tidak diketahui, dengan cara itu variabel yang tidak diinisialisasi adalah secara default Unknown.
SvenL
Setuju, @SvenL. Contoh diperbarui sesuai.
Bob Kaufman
Akankah Anda benar-benar memberikan [Flags]atribut pada contoh Anda? Tidak masuk akal jika sesuatu memiliki status "Tidak Lengkap" dan "Siap". Jika sudah enum [Flags]Steps { First, Second, Third }, akankah Anda benar-benar memberi nama variabel Anda completedStep?
Pakman
26

Situasi tidak pernah benar-benar berlaku untuk jamak.

Suatu enummenunjukkan atribut dari sesuatu atau yang lain. Saya akan memberi contoh:

enum Humour
{
  Irony,
  Sarcasm,
  Slapstick,
  Nothing
}

Anda dapat memiliki satu jenis, tetapi coba pikirkan dalam beberapa, bukan jamak:

Humour.Irony | Humour.Sarcasm

Daripada

Humours { Irony, Sarcasm }

Anda memiliki selera humor, Anda tidak memiliki selera humor.

Kyle Rosendo
sumber
5
Haha, well, programmer tidak selalu benar secara tata bahasa / politik. Dalam kasus Anda, saya kemungkinan menggunakan "HumourTypes". Kebiasaan buruk kurasa.
okw
Bagaimana jika saya ingin mencari semua orang yang memiliki Sense of Sarcasm ATAU memiliki rasa ironi, tidakkah saya akan melewati rutin pencarian yang Humoursberisi contoh Humours.Irony | Huomours.Sarcasm??
Charles Bretana
14

Secara umum, rekomendasi praktik terbaik adalah tunggal, kecuali untuk enum yang memiliki atribut [Bendera] yang melekat padanya, (dan yang karenanya dapat berisi bidang bit), yang harus jamak.

Setelah membaca pertanyaan Anda yang diedit, saya merasa Anda mungkin berpikir nama properti atau nama variabel harus berbeda dari nama tipe enum ... Tidak. Berikut ini baik-baik saja ...

  public enum Status { New, Edited, Approved, Cancelled, Closed }

  public class Order
  {
      private Status stat;
      public Status Status
      { 
         get { return stat; }
         set { stat = value; }
      }
  }
Charles Bretana
sumber
Benar, saya kira metode saya adalah cara 'cepat dan malas' untuk menghindari perlunya memikirkan nama saat menggunakan enum.
Oke
1
Untuk mendukung jawaban Anda: pada MSDN, dari Nama Anggota Tipe di bagian "Nama Properti": ✓ PERTIMBANGKAN memberikan properti nama yang sama dengan tipenya. Contoh: public Color Color { get {...} set {...} }
DavidRR
10

Ini adalah salah satu dari sedikit tempat yang saya tidak setuju dengan konvensi yang cukup untuk menentangnya. TBH, SAYA BENCI bahwa definisi enum dan turunannya dapat memiliki nama yang sama. Saya mem-postfix semua Enum saya dengan "Enum" secara khusus karena itu memperjelas konteksnya dalam penggunaan apa pun. IMO itu membuat kodenya jauh lebih mudah dibaca.

public enum PersonTypesEnum {
    smart,
    sad,
    funny,
    angry
}


public class Person {   
    public PersonTypesEnum PersonType {get; set;}
}

Tidak ada yang akan pernah bingung apa enum dan apa contohnya.

Heather
sumber
2
Saya datang ke sini mencari konvensi penamaan enum, setelah kelas dan enum bernama sama - dan ingin memiliki "sesuatu" untuk membuatnya lebih jelas. Saya sedang memikirkan awalan dengan "E" (untuk Enums jelas) seperti kita awalan antarmuka dengan "I" - tapi saya suka solusi Anda Heather! Bagus !!!
Scott
1
Dari garis desain Microsoft: "JANGAN gunakan sufiks" Enum "dalam nama tipe enum." docs.microsoft.com/en-us/dotnet/standard/design-guidelines/…
Thoryn Hawley
3
Mungkin Anda melewatkan kalimat SANGAT PERTAMA dari apa yang saya katakan? Di sini, izinkan saya menyalin dan menempelkannya untuk Anda: "Ini adalah salah satu dari sedikit tempat yang saya tidak setuju dengan konvensi yang cukup untuk menentangnya." Saya kemudian menjelaskan mengapa.
Heather
2
Saya tidak akan melanggar pedoman "dengan segala cara yang mungkin". Itu hiperbola. Saya menentang pedoman dengan cara tunggal dan spesifik, yang didukung oleh alasan saya menyatakan. Jika Anda ingin tidak setuju, baiklah, daftarkan alasan Anda untuk tidak setuju; hiperbola Anda tidak perlu dan tidak memajukan posisi Anda.
Heather
1
Jika ada kemungkinan tabrakan namespace, saya tidak melihat masalah dengan menambahkan Enum? Ini bukan seolah-olah penulis mengusulkan postfixing semua vars dengan tipenya. Penulis juga memiliki kasus yang jauh lebih kuat mengingat bahwa alasan diberikan, sedangkan M $ memberikan nol pembenaran.
Jai Govindani
7

Jika Anda mencoba untuk menulis secara langsung, kode yang dilarang seperti ini:

    public class Person
    {
        public enum Gender
        {
            Male,
            Female
        }
        //Won't compile: auto-property has same name as enum
        public Gender Gender { get; set; }  
    }

Pilihan Anda adalah:

  1. Abaikan rekomendasi MS dan gunakan awalan atau akhiran pada nama enum:

    public class Person
    {
        public enum GenderEnum
        {
            Male,
            Female
        }
        public GenderEnum Gender { get; set; }
    }
  2. Pindahkan definisi enum di luar kelas, lebih disukai ke kelas lain. Berikut ini adalah solusi mudah untuk hal di atas:

    public class Characteristics
    {
        public enum Gender
        {
            Male,
            Female
        }
    }
    public class Person
    {
        public Characteristics.Gender Gender { get; set; }  
    }
MiloNC
sumber
2
Situasi hipotetis dan bukan solusi yang baik. Mengapa menggunakan enumsarang di tempat pertama dan kemudian bersarang di kelas lain jika ini menyebabkan masalah?
Gert Arnold
1
Dalam kasus Gender, jauh lebih bermakna memiliki nama properti Genderdan nama enum sebagai Sex. Jadi isac.Gender = Sex.Male..
nawfal
3
Saya tidak yakin mengapa orang ini sedang downvoting. Situasi ini sah dan jauh dari hipotetis. Satu sarang tipe enum dalam C # untuk alasan yang sama bahwa seseorang mungkin menggunakan kelas batin di Jawa ... karena tipe batin hanya digunakan di luar dan tempat lain, dan masuk akal hanya dalam konteks luar dan tidak di tempat lain. Dan sebagai akibat dari keterbatasan kompiler, Anda harus memilih salah satu solusi yang disebutkan.
Nathan Pitman
Anda harus menyetelnya dari suatu tempat, biasanya di luar kelas, atau mungkin ketika membangun kelas, dalam hal ini Anda memerlukan enum untuk didefinisikan di luar, kecuali jika Anda ingin mengirim Orang. Jenis Kelamin. Laki-laki, Jenis Kelamin dapat berlaku untuk lebih daripada hanya orang, saya pikir tidak bersarang adalah solusi terbaik pula.
Jim Wolff
2
Pilihan lain, mungkin lebih baik adalah jawaban dari "Serge - appTranslator".
Curtis Yallop
6

Praktik Terbaik - gunakan tunggal. Anda memiliki daftar item yang membentuk Enum. Menggunakan item dalam daftar terdengar aneh ketika Anda mengatakannya Versions.1_0. Lebih masuk akal untuk mengatakan Version.1_0karena hanya ada satu Versi 1_0.

Jeremy Cron
sumber
5

Datang agak terlambat ...

Ada perbedaan penting antara pertanyaan Anda dan yang Anda sebutkan (yang saya tanyakan ;-):

Anda menempatkan definisi enum dari kelas, yang memungkinkan Anda untuk memiliki nama yang sama untuk enum dan properti:

public enum EntityType { 
  Type1, Type2 
} 

public class SomeClass { 
  public EntityType EntityType {get; set;} // This is legal

}

Dalam hal ini, saya akan mengikuti pedoman MS dan menggunakan nama tunggal untuk enum (jamak untuk bendera). Ini mungkin solusi termudah.

Masalah saya (dalam pertanyaan lain ) adalah ketika enum didefinisikan dalam ruang lingkup kelas, mencegah penggunaan properti yang dinamai persis setelah enum.

Serge Wautier
sumber
0

Di thread lain konvensi penamaan C # untuk enum dan properti yang cocok seseorang menunjukkan apa yang saya pikir adalah ide yang sangat bagus:

"Saya tahu saran saya bertentangan dengan konvensi Penamaan .NET, tetapi saya secara pribadi awalan enum dengan 'E' dan enum flag dengan 'F' (mirip dengan bagaimana kita awali Antarmuka dengan 'I')."

RenniePet
sumber