将(大量使用的)布尔值转换为多状态值

本文关键字:转换 布尔值 状态 | 更新日期: 2023-09-27 18:21:37

我需要更新一个类。它有一个布尔值,例如IsTypeA。

系统中目前有两种情况,即1。IsTypeA或2。而不是IsTypeA。

在标准条件if(IsTypeA)do X else do Y的情况下,这在很多地方都被引用。它也用于集成和外部数据,所以我不允许更改它。我只能添加到类中。

我们现在有了一个新的条件,所以IsTypeA需要有3个状态。

如果有另一个布尔值(比如IsTypeB),它将胜过IsTypeA布尔值,这似乎很奇怪。如果另一种类型(比如TypeC)出现,这也会使代码难以遵循,成为垃圾。

处理这种情况的最佳做法是什么?

我正在考虑做以下事情:

[Obsolete("Please refer to property 'MyType' for new usage", false)]
public bool IsTypeA
{
    get { return _isTypeA; }
    set 
    { 
    _isTypeA = value;
    if (value == true)
        MyType = EnumMyType.TypeA;
    }
}
private EnumMyType _myType;
public EnumMyType MyType
{
    get { return _myType; }
    set { _myType = value; }
}

(我之前在谷歌上搜索过。发现了这个问题,这是类似的,但在那个例子中,开发人员正在更新整个类。我只需要更新类中的一个属性)。

将(大量使用的)布尔值转换为多状态值

添加具有三个值TypeA、TypeB和TypeC 的枚举

  public enum MyType { A, B, C }

然后在您的类中添加另一个类型为该枚举的属性

public MyType ThreeStateType {get; set;}

并将您的旧属性委托给这个新属性(只使用getter)。。。

public bool IsTypeA { get { return ThreeStateType == MyType.A; } }

如果外部例程需要继续使用IsTypeA属性设置类型,也可以添加setter。。。

public bool IsTypeA 
{ 
     get { return ThreeStateType == MyType.A; } 
     set { if (value) ThreeStateType = MyType.A; }
         //   in this case it is not clear what to do 
         //   if the external routine sets IsTypeA  to [false]
}

这取决于在更改IsTypeA可用值的范围时,是否实际更改了其语义含义。如果是,那么您显然违反了接口的约定,因为IsTypeAtrue还是false的信息与对象的实际状态无关。

所以如果先前的实现声明对象是AB并且因此IsTypeAtruefalse,现在对象可以是ABC,但本质上仍然正确对象A产生IsTypeA == trueBs,C产生IsTypeA == false,然后使用@Charles解决方案:在保持向后兼容性的同时,在enum中提供新的详细信息。但如果不是这样,即对象C既不是true也不是false(关于IsTypeA),则您别无选择,只能升级合同(删除IsTypeA添加枚举ObjectType)。想象一下,外部集成读取对象CIsTypeA == false,而事实并非如此。