我需要更新一个班级。它有一个布尔值,例如IsTypeA。
系统目前有两个条件,即1. IsTypeA或2.不是IsTypeA。
如果(IsTypeA)执行X其他操作,则在标准条件下的很多地方引用它。它也用于集成和外部数据,因此我不允许更改它。我只能加入课堂。
我们现在有一个新的条件,因此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; }
}
(我之前用Google搜索过。发现this question,它是类似的,但在那个实例中,dev正在更新整个类。我只需要在类中更新一个属性。)
答案 0 :(得分:2)
添加一个包含三个值TypeA,TypeB和TypeC
的枚举 public enum MyType { A, B, C }
然后在你的课程中添加另一个输入此枚举的属性
public MyType ThreeStateType {get; set;}
并从您的旧房产委托给这个新房产(只有一个吸气剂)......
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]
}
答案 1 :(得分:1)
这取决于在更改IsTypeA
可用值的范围时,您实际上是否正在更改其语义含义。如果是 - 那么您显然违反了界面的合同,因为IsTypeA
true
false
是A
的信息与对象的实际状态无关。
因此,如果先前的实现声明对象是B
或IsTypeA
,因此true
是false
或A
,现在对象可以是B
或C
或A
但仍然基本上是真的对象IsTypeA == true
会产生B
和C
s然后IsTypeA == false
产生C
然后使用@Charles解决方案:在枚举中提供新的详细信息,同时保留向后兼容性。但如果不是这种情况,即对象true
既不是false
也不是IsTypeA
(关于IsTypeA
)那么你别无选择,只能升级合同(< strong>删除 ObjectType
和添加枚举IsTypeA == false
)。想象一下,对象C
读取{{1}}的外部集成,而事实并非如此。