有些主观。
我有一个枚举
public enum Faction {
Aliance,
Horde
}
因为我们都知道密切建模业务领域的代码所应用的“总是更好”。 在给定的域中有两个派系,这两个派系在上面的集合中列举。
问题:支持和反对的理由包括:上述enum
中的特殊成员,如:无和全部。
我个人认为那两个人不属于那里,因为没有像All和None这样的派系。另外使用flags-enum是不合适的。
解决方法是使用另一个枚举,它将模拟与派系的联属关系,在这种情况下 适合在其中包含诸如All和None之类的元素。
问题#2:我是否应该为了模型的正义而创建FactionAffiliation枚举?或者我应该多给自己额外打字并查看Faction enum,好像 FactionAffiliation?
答案 0 :(得分:4)
All
和None
通常是有意义的(您应该标记[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',无论哪个。 枚举是多种可能性的模型,您没有多种可能性。