枚举中的特殊成员:全部和无

时间:2010-08-05 13:52:58

标签: .net enums

  

可能重复:
  How to use Enum with aditional options (All, None)

有些主观。

我有一个枚举

public enum Faction {
    Aliance,
    Horde
}

因为我们都知道密切建模业务领域的代码所应用的“总是更好”。 在给定的域中有两个派系,这两个派系在上面的集合中列举。

问题:支持和反对的理由包括:上述enum中的特殊成员,如:无和全部。

我个人认为那两个人不属于那里,因为没有像All和None这样的派系。另外使用flags-enum是不合适的。

解决方法是使用另一个枚举,它将模拟与派系的联属关系,在这种情况下 适合在其中包含诸如All和None之类的元素。

问题#2:我是否应该为了模型的正义而创建FactionAffiliation枚举?或者我应该多给自己额外打字并查看Faction enum,好像 FactionAffiliation?

修改:复制How to use Enum with additional options (All, None)

4 个答案:

答案 0 :(得分:4)

当您处理要用作位域的枚举时,

AllNone通常是有意义的(您应该标记[Flags])。在这种情况下,你应该给你的第一个标志值为1,你的第二个标志值为2.然后,None可以采用默认值0并表示没有派系关系。 All成员是可选的,因为它可以通过按位或在其他两个标志上形成。标志枚举通常具有复数名称,如FactionAffiliations

如果您不处理标记,通常最好不要包含None值。您的大部分程序都不需要这样,所以这是一个特殊情况,您不必测试。如果您需要此None值,请考虑使用枚举的可枚举版本:Faction?。可以为空的枚举更好地表示缺少值而不是None枚举。

我认为您的代码是C#,但大多数建议应该保留在其他语言中。

答案 1 :(得分:2)

我会避免全部和无。给定一个人,说:那个人可能属于一个派系。那么回答“这个人在哪个派系中?”的问题我们可以简单地(比方说)阅读人的派系领域。但是对于All的特殊情况,属于(比方说)部落的人也属于All - 即使那个人的派系领域!= ALL。这改变了IN的含义,导致复杂的代码和微妙错误的风险。

答案 2 :(得分:1)

我从更实用的角度看待使用,而不是纯粹的OO设计。

是否存在使用Faction / FactionAffliance的地方,其中不允许使用All或None;你绝对必须要声明一个派系?

如果是这样,那么你应该使用两个单独的枚举。

如果没有 - 如果你在任何地方使用派系,“全部”和“无”都是可行的选择,然后只使用一个,并随意调用它。

答案 3 :(得分:0)

我想说你的实施应该得到改善 你正在使用枚举来建模一个简单的布尔状态 完全摆脱枚举并用布尔属性替换它:'IsAlliance'或'IsHorde',无论哪个。 枚举是多种可能性的模型,您没有多种可能性。