繁体   English   中英

枚举命名约定 - 复数

[英]Enum Naming Convention - Plural

尽管在枚举和匹配属性的 C# 命名约定中阅读了类似但不完全是我想要的内容,但我仍在问这个问题

我发现我倾向于以复数形式命名枚举,然后将它们“使用”为单数,例如:

public enum EntityTypes {
  Type1, Type2
}

public class SomeClass {
  /*
    some codes
  */

  public EntityTypes EntityType {get; set;}

}

当然它有效,这是我的风格,但是任何人都可以找到这种约定的潜在问题吗? 不过,我确实有一个带有“状态”一词的“丑陋”命名:

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

public class SomeClass {
  /*
    some codes
  */

  public OrderStatuses OrderStatus {get; set;}

}

附加信息:也许我的问题不够清楚。 在命名我定义的枚举类型的变量时,我经常不得不仔细考虑。 我知道最佳实践,但它无助于减轻我命名这些变量的工作。

我不可能将我所有的枚举属性(比如“Status”)公开为“MyStatus”。

我的问题:任何人都可以找到上述约定的潜在问题吗? 这与最佳实践无关。

问题改写:

好吧,我想我应该这样问这个问题:有人可以提出一种很好的通用方法来命名枚举类型,这样在使用时,枚举“实例”的命名将非常简单?

Microsoft 建议对Enum使用单数,除非Enum表示位字段(也使用FlagsAttribute )。 请参阅枚举类型命名约定(Microsoft 命名指南的子集)。

为了回应您的澄清,我认为以下任何一项都没有问题:

public enum OrderStatus { Pending, Fulfilled, Error };

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

或者

public enum OrderStatus { Pending, Fulfilled, Error };

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

我开始以复数命名枚举,但后来改为单数。 在使用它们的上下文中似乎更有意义。

enum Status { Unknown = 0, Incomplete, Ready }

Status myStatus = Status.Ready;

相比于:

Statuses myStatus = Statuses.Ready;

我发现单数形式在上下文中听起来更自然。 我们一致认为,在声明发生在一个地方的枚举时,我们在想“这是一组任何事物”,但是在使用它时,大概在许多地方,我们正在考虑“这是一个事物” .

这种情况从未真正适用于复数。

enum显示某物的属性。 我举个例子:

enum Humour
{
  Irony,
  Sarcasm,
  Slapstick,
  Nothing
}

你可以有一种类型,但试着用复数而不是复数来考虑它:

Humour.Irony | Humour.Sarcasm

而不是

Humours { Irony, Sarcasm }

你有幽默感,你没有幽默感。

一般来说,最佳实践建议是单数,除了那些附加了 [Flags] 属性的枚举(因此可以包含位字段),它们应该是复数。

阅读您编辑的问题后,我感觉您可能认为属性名称或变量名称必须与枚举类型名称不同......事实并非如此。 以下完全没问题...

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

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

这是我不同意公约足以反对它的少数几个地方之一。 TBH,我讨厌枚举的定义和它的实例可以具有相同的名称。 我专门用“Enum”后缀我的所有枚举,因为它清楚地表明它在任何给定用法中的上下文是什么。 IMO 它使代码更具可读性。

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


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

没有人会混淆什么是枚举,什么是它的实例。

如果您尝试编写简单但被禁止的代码,如下所示:

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

您的选择是:

  1. 忽略 MS 建议并在枚举名称上使用前缀或后缀:

     public class Person { public enum GenderEnum { Male, Female } public GenderEnum Gender { get; set; } }
  2. 将枚举定义移到类之外,最好是移到另一个类中。 对于上述问题,这里有一个简单的解决方案:

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

最佳实践 - 使用单数。 您有一个组成 Enum 的项目列表。 当您说Versions.1_0时,使用列表中的项目听起来很奇怪。 Version.1_0更有意义,因为只有一个 1_0 版本。

来的有点晚...

您的问题与您提到的问题(我问;-)之间存在重要区别:

您将枚举定义放在类之外,这允许您为枚举和属性使用相同的名称:

public enum EntityType { 
  Type1, Type2 
} 

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

}

在这种情况下,我会遵循 MS 指南并为枚举使用单数名称(标志为复数)。 这可能是最简单的解决方案。

我的问题(在另一个问题中)是在类的范围内定义枚举时,阻止使用完全以枚举命名的属性。

在另一个线程C# 枚举和匹配属性的命名约定上,有人指出我认为是一个非常好的主意:

“我知道我的建议与 .NET 命名约定背道而驰,但我个人用 'E' 前缀枚举,用 'F' 前缀枚举标志(类似于我们如何用 'I' 前缀接口)。

对枚举声明使用复数的原因是(在声明时)我们用多个值声明它,所以复数看起来不错......但我们忽略了声明时枚举指定它可以具有什么值的事实(来自给定的一组值)。 这并不意味着该枚举的实例将存储多个值..... 当我们写: enum Days { MON, TUE, WED, THU, FRI, SAT, SUN}; 由于提供了多个值,我们将其设为复数.. 然而,当使用 (Days day = Days.MON; ) 时,我们完全忽略了该枚举的实例应该具有单个值......所以当我们写: enum第 { 星期一、星期二、星期三、星期四、星期五、星期六、星期日 }; 我们的意思是有一个枚举可以将任何一天作为其值,因此单数更合适。 虽然(已经在上面描述过),要在不使用单数名称的情况下解决这个问题,可以使用任何类型的指标,例如 DayEnum 或 EDay(我更喜欢第二个)...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM