使用布尔值还是枚举类型来表示“新或旧”?

5
我有一个也许很傻的问题...我正在尝试确定键入属性值为“New”或“Used”的最佳方法。我应该使用枚举还是只使用布尔值(例如,IsNew)?如果我选择使用枚举,应该如何命名此类型和属性名称?(public NewOrUsed NewOrUsed {get; set;} <--令人困惑)
显然,使用枚举可以声明既不是“New”也不是“Used”的状态(NONE、NEW、USED),而且枚举更具未来性(虽然有人可能认为不会存在其他值)。那么,这样的类型和属性应该采用什么适当的名称呢?
使用布尔值很直接(使用IsNew或IsUsed)。
我知道这很傻,但我很好奇别人怎么想。
谢谢!
7个回答

6

枚举 更具未来性。

其实并不是这样。你无法预知未来会带来什么。如果以后需要更改,那就进行更改。所以,遵循KISS原则。使用:

 public bool IsNew { get; set; }

完成了,继续前进,在其他地方增加价值。


3
我不喜欢重复的属性。这暗示了某种独立性。而且一旦添加第三个状态,设置器就会失效。 - CodesInChaos
我肯定更喜欢这个解决方案。它声明了公共接口,清晰明了(IsNew,IsUsed),并且您可以自由地在将来更改其实现(如果您需要进行一些添加或更改)。 - Al Kepp
我不确定我会认为这段代码比“枚举”更简单。我也不喜欢有两个属性,即使对象在任何给定时间只能处于一个状态(“新”或“旧”)中的一个。这可能会引起混淆。 - FrustratedWithFormsDesigner
@zam6ak:如果未来没有其他选择怎么办?别担心,继续前进! - jason
@Jason Boom 继续前进,在其他地方增加价值,一年后未来“发生”了,你最终会花费数小时/数天重构和重新编码...那时你的价值在哪里?我的问题不是未来是否会发生,而是采取哪种方法最少干扰并适应变化? - zam6ak
显示剩余8条评论

4
使用枚举。我会将其称为“Condition”。您不需要一个“None”值,只需使其可为空。

4
如果您已经使用了枚举,那么添加一个“None”值可能比使用可空类型更好。根据我的经验,可空类型很麻烦。 - CodesInChaos
我已经有一个条件 - 它指的是当某物被“使用”时的条件(例如,使用过的车辆/书籍可以处于“良好”,“像新的”,“完美”的状态);) - zam6ak
我会在该条件枚举中添加一个值 new - CodesInChaos

3

如果我发现自己不断地将布尔值转换为“new”或“used”,我会选择枚举。

如果我更关注这个值作为指示器(例如通过if(something.isNew)进行操作),我会使用布尔值。


3
您在评论中提到:“我已经有一个条件 - 它指的是当某物处于“已使用”状态时的条件(例如,使用过的车辆/书籍可以处于“良好”,“像新的”,“完美”的状态);)”。所以,有了这个信息,我肯定会选择一个bool。您已经有了一种可扩展的方式来确定条件,因此这更多是一个分类问题。你可能在未来想要知道是否有超过一个条件被视为“新的”,比如说:
public enum ConditionType {Fair, LikeNew, Mint, New}

public ConditionType Condition { get; set; }

public bool IsNew
{
    get { return Condition == ConditionType.New || Condition == ConditionType.Mint; }
}

是的,这是正确的做法,因为他已经有其他条件了。 - CodesInChaos

2

对于新建对象,我会使用布尔类型。在这种情况下,使用枚举类型会过度设计。


1
eBay有新的和新的其他来区分原包装销售的商品和以不同包装或无包装销售的商品。我会选择枚举类型,因为它具有可扩展性,正如你所说的“未来证明”。

1

我通常反对过度工程,所以我的第一反应是使用布尔值。

但从概念上讲,它不像一个逻辑布尔值。它感觉像一个枚举,目前恰好有两个值。我通常将条件想象为“新”和“旧”,而不是在脑海中将其想象为“新”和“非新”。

我预计将来会添加其他“条件”,例如“翻新的”。但当然,由于IDE功能(如“查找所有引用”),从单个属性进行重构不会那么困难。并且一旦向枚举中添加新值,您仍需要使用此属性调整逻辑。

对我来说,未来的保护是次要的原因。对我来说,概念上不干净更重要。


重构属性名称根本不是问题...但是从布尔值改为枚举(或反之亦然)需要更多的工作,我想...不过这是一个很好的见解... - zam6ak
重构属性名称并不是问题。但一旦您向枚举添加另一个值,您需要重新处理使用该属性以处理其他潜在值的所有位置。 - CodesInChaos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接