Enum Adlandırma Sözleşmesi - Çoğul


267

Benzeri ama tam olarak ne ben numaralandırma ve eşleşen özellik için C # adlandırma kuralında istediğini rağmen bu soruyu soruyorum

Enumları çoğul olarak adlandırma eğilimindeyim ve sonra bunları tekil olarak kullanıyorum, örnek:

public enum EntityTypes {
  Type1, Type2
}

public class SomeClass {
  /*
    some codes
  */

  public EntityTypes EntityType {get; set;}

}

Tabii ki işe yarıyor ve bu benim tarzım, ancak böyle bir sözleşmede potansiyel bir sorun bulabilen var mı? Gerçi "Durum" sözcüğü ile bir "çirkin" adlandırma var:

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

public class SomeClass {
  /*
    some codes
  */

  public OrderStatuses OrderStatus {get; set;}

}

Ek Bilgi: Belki sorum yeterince açık değildi. Tanımlanmış numaralandırma türlerimin değişkenlerini adlandırırken sık sık çok düşünmem gerekir. En iyi uygulamayı biliyorum, ancak bu değişkenleri adlandırma işimi kolaylaştırmak işe yaramıyor.

Tüm numaralandırma özelliklerimi ("Durum" diyelim) "MyStatus" olarak gösteremiyorum.

Benim sorum: Yukarıda açıklanan sözleşmemde potansiyel bir sorun bulabilir mi? En iyi uygulama ile ilgili DEĞİLDİR.

Soru yeniden ifade:

Sanırım soruyu şu şekilde sormalıyım: Birisi enum tipini isimlendirmek için kullanıldığında, enum 'örneğinin' adlandırılması oldukça basit olacak şekilde iyi bir genel yol ortaya çıkarabilir mi?


5
public enum OrderState ... - public OrderState OrderStatus {get; set;}
Fraser

Yanıtlar:


333

Microsoft Enum, Enumbit alanlarını temsil etmediği sürece s için tekil kullanılmasını önerir (de kullanın FlagsAttribute). Numaralandırma Türü Adlandırma Kuralları (Microsoft'un Adlandırma Yönergeleri'nin bir alt kümesi) konusuna bakın .

Açıklamanıza yanıt vermek için aşağıdakilerden herhangi birinde yanlış bir şey görmüyorum:

public enum OrderStatus { Pending, Fulfilled, Error };

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

veya

public enum OrderStatus { Pending, Fulfilled, Error };

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

20
Evet, bu doğru bir cevap. Bu kılavuzlar .Net Framework'te kullanılır, örneğin enum DayOfWeek ve flags enum RegexOptions.
Alexander Zwitbaum

1
Evet, önerilen uygulama bu, hoş geldiniz. Ancak soruma cevap vermiyor.
okw

1
Çirkin görünse de, daha ayrıntılı bir şekilde incelemek için @okw, bir bayrak numarasından tek bir değere ihtiyacınız varsa, alan / özellik / bağımsız değişken için tekil formu kullanın. Birden fazla bayrak ayarlanmış olmasını destekliyorsanız, çoğulu kullanın. Numaralandırmanız bir bayrak sıralaması değilse, tür adı ve alan / özellik / bağımsız değişkenler için tekil kullanın.
Jonathan Dickinson

4
Yanıtta bağlantısı verilen Microsoft adlandırma kuralları kılavuzunun .Net 4.0 sürümüne bağlantı.

1
@Tamamlar onunla hiç bir sorun yaşamadım, neden işe yaramayacağını göremiyorum - bir tür veya değişkenin referans alınıyor olmasının belirsiz olacağı bir bağlam görmüyorum. yani OrderStatus == OrderStatus.Pendingsol için bir değişken ve sonra sağda bir numaralandırma olarak tanınır
James Hurley

39

Çoğullarda enumları adlandırmaya başladım, ancak o zamandan beri tekil olarak değiştim. Nerede kullanıldıkları bağlamında daha mantıklı görünüyor.

enum Status { Unknown = 0, Incomplete, Ready }

Status myStatus = Status.Ready;

Karşılaştırmak:

Statuses myStatus = Statuses.Ready;

Bağlamda daha doğal görünecek tekil formu buluyorum. Tek bir yerde gerçekleşen sıralamayı ilan ederken, "bu bir grup vahşiler" olduğunu düşünüyoruz, ancak bunu kullanırken, birçok yerde, "bu her ne ise" diye düşünüyoruz .


6
Biraz geç reaksiyon (ve belki biraz konu dışı) ama: 0bilinmeyen değer için değer kullanmanızı öneririm , bu şekilde başlatılmamış bir değişken varsayılan olarak Unknown.
SvenL

Kabul etti, @SvenL. Buna göre güncellenmiş örnek.
Bob Kaufman

[Flags]Yine de örneğinize gerçekten bir özellik koyar mısınız? Bir şeyin hem "Tamamlanmadı" hem de "Hazır" durumuna sahip olması mantıklı değildir. Eğer olsaydı enum [Flags]Steps { First, Second, Third }, değişkenine gerçekten isim verir completedStepmisin?
Pakman

26

Durum asla çoğul için gerçekten geçerli değildir.

Bir enum, bir şeyin veya başka bir şeyin niteliğini gösterir. Bir örnek vereceğim:

enum Humour
{
  Irony,
  Sarcasm,
  Slapstick,
  Nothing
}

Bir türünüz olabilir, ancak çoğul yerine birden çok şeyi düşünmeyi deneyin:

Humour.Irony | Humour.Sarcasm

Ziyade

Humours { Irony, Sarcasm }

Bir mizah anlayışınız var, mizah anlayışınız yok.


5
Haha, programcılar her zaman dilbilgisel / politik olarak doğru değil. Sizin durumunuzda "HumourTypes" kullanıyorum. Kötü alışkanlık sanırım.
okw

Peki alaycılık duygusu olan veya ironi duygusu olan tüm bireyleri aramak istersem, arama rutinini Humoursiçeren bir örneği geçmez miyim Humours.Irony | Huomours.Sarcasm?
Charles Bretana

14

Genel olarak, en iyi uygulama önerisi, kendilerine [Bayraklar] özniteliği olan (ve bu nedenle çoğul olması gereken bit alanları içerebilen) numaralandırmalar hariç, tekildir.

Düzenlenen sorunuzu okuduktan sonra, özellik adının veya değişken adının numara türü türünden farklı olması gerektiğini düşündüğünüzü hissediyorum. Aşağıdaki gayet iyi ...

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

  public class Order
  {
      private Status stat;
      public Status Status
      { 
         get { return stat; }
         set { stat = value; }
      }
  }

Doğru, sanırım benim yöntem enums kullanırken isimleri düşünme ihtiyacını önlemek için 'hızlı ve tembel' bir yoludur.
okw

1
Yanıtınızı desteklemek için: MSDN'de, "Özelliklerin Adları" bölümündeki Tür Üyelerinin Adlarından: Bir özelliğe türüyle aynı adı veren CONSIDER . Örnek: public Color Color { get {...} set {...} }
DavidRR

10

Bu, konvansiyona katılmaya yetecek kadar katılmadığım birkaç yerden biri. TBH, bir enum tanımının ve örneğinin aynı ada sahip olabileceğinden nefret ediyorum. Belirli bir kullanımda bağlamının ne olduğunu açıkça belirttiği için tüm Numaralarımı "Enum" ile postfix. IMO kodu çok daha okunaklı hale getirir.

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


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

Kimse enumun ne olduğunu ve örneğinin ne olduğunu karıştırmaz.


2
Buraya aynı adlı bir sınıf ve enum yaptıktan sonra bir enum adlandırma kuralı aramaya geldim - ve daha açık hale getirmek için "bir şey" olmasını istedim. Ben "E" ile arayüzleri önek gibi "E" ile önek (Açıkça Enums için) ön düşünüyordum - ama çözüm Heather sevdim! Güzel bir!!!
Scott

1
Microsoft'un tasarım kılavuzlarından: "Numaralandırma türü adlarında" Numaralandırma "soneki KULLANMAYIN." docs.microsoft.com/tr-tr/dotnet/standard/design-guidelines/…
Thoryn Hawley

3
Belki de söylediklerimin ÇOK İLK cümlesini kaçırdınız mı? Burada, sizin için kopyalayıp yapıştırmama izin verin: "Bu, konvansiyona katılmaya yetecek kadar katılmadığım birkaç yerden biri.". Sonra nedenini açıklamaya devam ediyorum.
Heather

2
"Mümkün olan her şekilde" kurallara aykırı değilim. Bu abartı. Belirttiğim akıl yürütme tarafından desteklenen, tek ve özel bir yolla yönergeleri karşılıyorum. Eğer katılmıyorum, iyi, katılmama nedenlerinizi listeleyin; hiperbolunuz gereksizdir ve pozisyonunuzu ilerletmez.
Heather

1
Bir ad alanı çarpışması varsa, ekleme ile ilgili bir sorun görmüyorum Enum? Sanki yazar postfixing öneriyor gibi değil kendi türüne göre değişir. Bir neden belirtildiği takdirde yazarın çok daha güçlü bir durumu vardır, oysa M $ sıfır gerekçe sağlar.
Jai Govindani

7

Böyle basit, ancak yasak kod yazmaya çalışıyorsanız:

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

Seçenekleriniz:

  1. MS önerisini dikkate almayın ve numaralandırma adında bir önek veya sonek kullanın:

    public class Person
    {
        public enum GenderEnum
        {
            Male,
            Female
        }
        public GenderEnum Gender { get; set; }
    }
  2. Numaralandırma tanımını sınıfın dışında, tercihen başka bir sınıfa taşıyın. İşte yukarıdakilere kolay bir çözüm:

    public class Characteristics
    {
        public enum Gender
        {
            Male,
            Female
        }
    }
    public class Person
    {
        public Characteristics.Gender Gender { get; set; }  
    }

2
Varsayımsal durum ve iyi bir çözüm değil. Neden enumilk etapta bir yuvalanmış kullanın ve bu da soruna neden oluyorsa başka bir sınıfta yuvalayın?
Gert Arnold

1
Cinsiyet durumunda, mülkiyet adı olarak Genderve numaralandırma olarak sahip olmak çok daha anlamlı Sex. Yani isac.Gender = Sex.Male..
nawfal

3
Bu adamın neden indirildiğinden emin değilim. Bu durum meşrudur ve varsayımsal olmaktan uzaktır. Biri, Java'da bir iç sınıf kullanabileceğine benzer nedenlerle C # türündeki enum türlerini iç içe geçirir ... çünkü iç tür yalnızca dış ve başka hiçbir yerde kullanılmaz ve başka bir yerde değil, yalnızca dış bağlamda anlamlıdır. Derleyici sınırlamalarının bir sonucu olarak, belirtilen çözümlerden birini seçmeniz gerekir.
Nathan Pitman

Genellikle sınıfın dışında bir yerde veya sınıfı oluştururken ayarlamanız gerekir, bu durumda Person.Gender.Male'de göndermek istemiyorsanız, enum'un dışarıda tanımlanması gerekir. sadece insanlardan daha fazla, iç içe geçmemenin en iyi çözüm olduğunu düşünüyorum.
Jim Wolff

2
Bir başka, muhtemelen daha iyi bir seçenek "Serge - appTranslator" dan gelen cevaptır.
Curtis Yallop

6

En İyi Uygulama - tekil kullanın. Bir Numaralandırma oluşturan öğeler listeniz var. Listede bir öğeyi kullanmak dediğinde garip geliyor Versions.1_0. Version.1_0Sadece bir 1_0 Sürümü olduğu için söylemek daha mantıklı .


5

Biraz geç geliyor ...

Sorunuzla bahsettiğiniz soru arasında önemli bir fark var (sorduğum ;-):

Enum tanımını sınıftan çıkarırsınız, bu da enum ve özellik için aynı ada sahip olmanızı sağlar:

public enum EntityType { 
  Type1, Type2 
} 

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

}

Bu durumda, MS guidelinlerini takip eder ve numaralandırma için tekil bir isim kullanırım (bayraklar için çoğul). Bu probaby en kolay çözümdür.

Benim sorunum ( diğer soruda ) enum sınıf kapsamında tanımlandığında, tam olarak enum sonra adlı bir özellik kullanımını engellemektir.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.