什么是Enum for Yes&的好名字没有价值

时间:2008-12-22 06:57:33

标签: c# coding-style naming-conventions naming

背景

在我写的C#命令行应用程序中,有几个参数的“是”和“否”是可能的值。

我使用下面显示的Enum类型存储他们的输入。

enum YesNo
{
     Yes,
     No
}

哪个好 - 代码有效。没问题。

注意:是的,我可以将它们存储为bool(这是它以前的工作原理)。我的设计选择是明确用户做出的是/否选择,因为他们会在其他情况下看到这个选项,我希望它更明显的选择是什么。

我的问题

  • 有一个名为“YesNo”的枚举似乎很奇怪 - 对于“是”和“否”值的枚举更好的名称有什么建议。

最后

我在StackOverflow的生命中相对较早地提出了这个问题。这不是假问题 - 我确实遇到过这种情况。我只是觉得用它看看社区会做什么会很好。因为它,我承认一个有点奇怪的问题。

首先,感谢所有花时间回复的人。我试图以一个深思熟虑的结论来支付这笔费用。

对答案的评论

切换到bool 。我理解你的动机,但我觉得我需要指出有一个二元选择(我的意思是在任意两个值之间做出选择 - 活着/死亡,已婚/未婚等)与true和false之间的布尔选项不同。我们发现程序员在yes / no和true / false之间切换容易 - 足够公平。如果我在这种情况下的选择是例如“民主党人”或“复制”“(人为的例子,我知道)那么你可以看到混淆或至少尴尬的可能性。我认为bool选项在这种情况下是有效的,但是更少所以在其他二元选择中。

本地化 - 非常好。在我的具体情况下,它并不重要 - 这不是也不会是本地化的,但在其他情况下需要考虑。

超过三个选项 - 事实上,稍后我必须添加第三个值来表示用户的有效(在我的应用程序中)条件 not 做出选择。

有很多好评,谢谢大家!

17 个答案:

答案 0 :(得分:36)

您说您不想使用bool,因为它将打印出来供用户查看以及其他内容。这表明问题不在存储中,而在显示中。通过任何方式将是/否作为是/否,但是没有必要为它创建一个全新的类型IMO。

编辑:除了建议你不首先使用枚举之外,我强烈建议如果你使用枚举,你可以更改顺序或使用显式值。如果您最终将值视为整数,则Yes = 0,No = 1将会非常混乱。

答案 1 :(得分:7)

我会很困惑地看到一个用于布尔值的枚举。你这么说:

  

注意:是的,我可以将它们存储为bool(这是它以前的工作原理)。我的设计选择   要明确用户做出的是/否选择,因为他们会看到这一点   用其他内容打印出来,我希望选择的内容更明显。

我没有看到“是”或“否”如何更“明确”而不是真或假。

答案 2 :(得分:7)

我建议您使用一个名称来指示设置为是或否的值。

E.G。


public enum Married
{
    YES,
    NO
}

答案 3 :(得分:6)

ResponseEnum或EResponse或UserResponse,具体取决于您的约定。

我不会仅限于是或否,因为将来您可能还想添加需要不确定响应的功能。

答案 4 :(得分:5)

我想打电话给它:

enum Boolean
{
     Yes,
     No
}

不,等等,你可以使用内置的布尔类型。

如果你在这里使用枚举的唯一原因是因为你想要向用户显示一个方便的字符串转换,那么当你做更多复杂的事情时,你会被困在轨道上。从视图中分离模型将为您提供良好的服务。阅读MVC和/或MVVM模式。

我可能还会建议一个带有一些自定义属性的简单布尔值来定义要用来代替“true”和“false”的显示字符串,这里就足够了。然后,您可以编写自己的字符串方法,以查找自定义属性。

答案 5 :(得分:3)

我根本不会使用枚举,只需滚动自己的typeconverter并使用布尔值。

答案 6 :(得分:2)

我认为YesNo就好了。考虑像“MB_OK”和“MB_YESNO”之类的东西......我知道它不是一种类型,但任何不言自明的东西都应该没问题。

答案 7 :(得分:2)

是否有可能选择除了是/否以外的选项。仅仅2个选项坚持使用布尔值。尝试单独修改显示区域

答案 8 :(得分:2)

我猜显示bool值存在问题。 最好创建一个存储boolean的简单包装器,允许您将它们显示为Yes / No或True / False。

答案 9 :(得分:1)

  • YESNO
  • 选择
  • BinaryChoice

或者只使用布尔值。

答案 10 :(得分:1)

当我需要这样的东西时,我会使用单词Flag,如Flag.YesMarriedFlag.No等。

何时有用的示例:您知道今天只有Yes和No值,但您怀疑将来可能会有其他值(例如Maybe)。

答案 11 :(得分:1)

(幽默 - 不要认真对待......)

我很惊讶没有人建议这样做:

public enum UserWtf
{
    No,
    Yes,
    FileNotFound
}

答案 12 :(得分:1)

我阅读了你的最新解释,但我仍觉得这是一个糟糕的选择。布尔人正是为了这个目的而存在的。确保当“他们将在其他内容中看到这些内容时”输出适当的文本时, 负责这可以很简单:

Console.WriteLine(_(“Using Foo:”)+(useFoo?_(“Yes”):_(“No”)));

虽然仍然完全支持本地化。 useFoo当然是一个告诉函数是否使用foo的参数。 :)

_是gettext函数(http://www.gnu.org/software/gettext/)的缩写,可用于C#(http://www.gnu.org/software/automake/manual/gettext/C_0023.html)。

答案 13 :(得分:1)

EUserAction?

您将其描述为某些用户操作。不过,你也可以更具体一些。该名称允许将来进行一些额外的选择。 (名称应该是选择的目的,而不是选择的内容)

然而,对于你的另一个微妙的问题:

  

因为他们会在其他情况下看到这些内容,我希望选择的内容更明显。

用户看到的内容应该不重要。数据模型可能与您向用户呈现的内容大不相同。一个布尔就足够了。是否有可能在未来采取其他行动?

答案 14 :(得分:0)

我没有看到这个枚举的重点,除非除了是和否之外还有其他一些值。这只是一个布尔。而制作一个枚举只是为了让你不必输入是或否似乎有点傻。

答案 15 :(得分:0)

使用bool,结合bool.TrueString和bool.FalseString进行显示。

答案 16 :(得分:0)

我使用OptionalBinaryFilter:

是,否,全部

但是如果你只有Yes和No,那么在成员中似乎更适合使用Boolean。