将(大量使用的)布尔值转换为多状态值
本文关键字:转换 布尔值 状态 | 更新日期: 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
可用值的范围时,是否实际更改了其语义含义。如果是,那么您显然违反了接口的约定,因为IsTypeA
是true
还是false
的信息与对象的实际状态无关。
所以如果先前的实现声明对象是A
或B
并且因此IsTypeA
是true
或false
,现在对象可以是A
、B
或C
,但本质上仍然正确对象A
产生IsTypeA == true
和B
s,C
产生IsTypeA == false
,然后使用@Charles解决方案:在保持向后兼容性的同时,在enum中提供新的详细信息。但如果不是这样,即对象C
既不是true
也不是false
(关于IsTypeA
),则您别无选择,只能升级合同(删除IsTypeA
并添加枚举ObjectType
)。想象一下,外部集成读取对象C
的IsTypeA == false
,而事实并非如此。