【问题标题】:Enum Naming Convention - Plural枚举命名约定 - 复数
【发布时间】:2010-11-27 05:04:08
【问题描述】:

尽管在C# naming convention for enum and matching property 阅读过类似但不完全是我想要的内容,但我仍然在问这个问题

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

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;}

}

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

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

我的问题:谁能发现我上述约定的潜在问题? 这与最佳实践无关。

问题改写:

好吧,我想我应该这样问这个问题:有人能想出一个好的通用方式来命名枚举类型,这样在使用时,枚举“实例”的命名会非常简单吗?

【问题讨论】:

  • 公共枚举 OrderState... - 公共 OrderState OrderStatus { get;设置;}

标签: c# .net enums naming-conventions plural


【解决方案1】:

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

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

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

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

【讨论】:

  • 没错,我想我的方法是一种“快速而懒惰”的方式,可以避免在使用枚举时考虑名称。
  • 支持您的回答:在 MSDN 上,来自“属性名称”部分的 Names of Type Members✓ CONSIDER 提供与其类型相同名称的属性。 示例: public Color Color { get {...} set {...} }
【解决方案2】:

Microsoft 建议对Enums 使用单数,除非Enum 表示位字段(也使用FlagsAttribute)。请参阅Enumeration Type Naming Conventions(Microsoft 的Naming Guidelines 的一个子集)。

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

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; }
}

【讨论】:

  • 是的,这是一个正确的答案。该指南用于 .Net 框架,例如枚举 DayOfWeek 并标记枚举 RegexOptions。
  • 是的,这是推荐的做法,我欢迎。但是它没有回答我的问题。
  • @o.k.w 进一步详细说明,虽然它看起来很难看,但如果您需要来自标志枚举的单个值,请使用字段/属性/参数的单数形式。如果您支持设置多个标志,请使用复数。如果您的枚举不是标志枚举,请使用单数作为类型名称和字段/属性/参数。
  • 这是答案中链接到的 Microsoft 命名约定指南的 the link to the .Net 4.0 version
  • @Thomas 我从来没有遇到过问题,我不明白为什么它不起作用——看不到它是类型还是变量会模棱两可的上下文被引用。即OrderStatus == OrderStatus.Pending 被识别为左侧的变量,然后是右侧的枚举
【解决方案3】:

我一开始用复数命名枚举,但后来改为单数。只是在使用它们的环境中似乎更有意义。

enum Status { Unknown = 0, Incomplete, Ready }

Status myStatus = Status.Ready;

比较:

Statuses myStatus = Statuses.Ready;

我发现单数形式在上下文中听起来更自然。我们一致认为,在声明枚举时,它发生在一个地方,我们在想“这是一组随便什么”,但是在使用它时,大概在很多地方,我们在想“这是一个随便” .

【讨论】:

  • 反应有点晚(也许有点离题)但是:我建议使用值0 作为未知值,这样未初始化的变量默认为Unknown。跨度>
  • 同意,@SvenL。相应地更新了示例。
  • 你真的会在你的例子中加上[Flags] 属性吗?某些东西同时具有“未完成”和“就绪”状态是没有意义的。如果你有enum [Flags]Steps { First, Second, Third },你真的会把你的变量命名为completedStep吗?
【解决方案4】:

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

【讨论】:

    【解决方案5】:

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

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

    enum Humour
    {
      Irony,
      Sarcasm,
      Slapstick,
      Nothing
    }
    

    你可以有一种类型,但试着把它想成复数,而不是复数:

    Humour.Irony | Humour.Sarcasm

    而不是

    Humours { Irony, Sarcasm }

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

    【讨论】:

    • 哈哈,好吧,程序员并不总是在语法/政治上正确。在您的情况下,我可能会使用“HumourTypes”。我猜是坏习惯。
    • 如果我想搜索所有有讽刺感或讽刺感的人,我会不会在搜索例程中传递一个包含Humours.Irony | Huomours.SarcasmHumours 实例??
    【解决方案6】:

    在另一个线程C# naming convention for enum and matching property 上有人指出了我认为非常好的想法:

    “我知道我的建议违反了 .NET 命名约定,但我个人用 'E' 作为枚举前缀,用 'F' 作为枚举标志前缀(类似于我们在接口前使用 'I' 前缀的方式)。”

    【讨论】:

      【解决方案7】:

      来晚了……

      您的问题与you mention 的问题(我问过 ;-) 之间有一个重要区别:

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

      public enum EntityType { 
        Type1, Type2 
      } 
      
      public class SomeClass { 
        public EntityType EntityType {get; set;} // This is legal
      
      }
      

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

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

      【讨论】:

        【解决方案8】:

        如果你想写这样简单但被禁止的代码:

            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,然后再将它嵌套在另一个类中,如果这会造成麻烦?
        • 在 Gender 的情况下,属性名称为 Gender 和枚举名称为 Sex 更有意义。所以isac.Gender = Sex.Male..
        • 我不知道为什么这个人被否决了。这种情况是合理的,远非假设。一个在 C# 中嵌套枚举类型的原因与可能在 Java 中使用内部类的原因类似……因为内部类型仅用于外部而不在其他任何地方使用,并且仅在外部上下文中而不在其他地方有意义。由于编译器的限制,您必须选择上述解决方案之一。
        • 你必须从某个地方设置它,通常是在类之外,或者在构造类时,在这种情况下你需要在外面定义枚举,除非你想发送 Person.Gender .Male,Gender 不仅仅适用于人,我认为不嵌套是最好的解决方案。
        • 另一个可能更好的选择是来自“Serge - appTranslator”的答案。
        【解决方案9】:

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

        public enum PersonTypesEnum {
            smart,
            sad,
            funny,
            angry
        }
        
        
        public class Person {   
            public PersonTypesEnum PersonType {get; set;}
        }
        

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

        【讨论】:

        • 我来这里是为了寻找一个枚举命名约定,在类和枚举命名相同之后 - 并希望有“一些东西”让它更明显。我正在考虑用“E”作为前缀(显然是枚举),就像我们用“I”作为接口前缀一样 - 但我喜欢你的解决方案Heather!不错!!!
        • 来自微软的设计准则:“不要在枚举类型名称中使用“枚举”后缀。” docs.microsoft.com/en-us/dotnet/standard/design-guidelines/…
        • 也许你错过了我所说的第一句话?在这里,让我为您复制并粘贴它:“这是少数几个我不同意约定而足以反对它的地方之一。”。然后我继续解释原因。
        • 我不会“以各种可能的方式”违反准则。这太夸张了。我将以一种单一、具体的方式违反指导方针,这得到了我所说的推理的支持。如果你想不同意,很好,列出你不同意的理由;你的夸张是不必要的,也不会提升你的立场。
        • 如果可能存在命名空间冲突,我认为添加 Enum 没有问题?这并不是说作者建议用它们的类型对所有变量进行后缀。鉴于提供了一个理由,作者也有一个更强有力的案例,而 M$ 提供零理由。
        【解决方案10】:

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

        【讨论】:

          猜你喜欢
          • 2011-03-05
          • 1970-01-01
          • 1970-01-01
          • 2015-08-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-23
          • 1970-01-01
          相关资源
          最近更新 更多