2014-09-12 57 views
0

我需要更新一个类。它有一个布尔例如IsTypeA。将(使用很多)布尔转换为多个状态值

系统中目前有两个条件,即1. IsTypeA或2.不是IsTypeA。

这是在标准条件下的很多地方引用的,如果(IsTypeA)做X else做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; } 
} 

(我以前用Google搜索找到this question,这是类似的,但在该实例的开发正在更新全班我只需要更新一个属性。在课堂上)。

+4

这似乎是合理的。你有什么担忧?一次可以争辩说,“TypeA”和“TypeB”应该是子类,所以多态可以处理所有事情,但这可能太过剧烈。 – BradleyDotNET 2014-09-12 16:42:27

+3

我将摆脱_isTypeA,而只是获取/设置'IsTypeA'属性完全在'MyType'的当前值上。 – crashmstr 2014-09-12 16:45:17

+1

我个人只是使​​用枚举。 – TyCobb 2014-09-12 16:46:41

回答

2

添加有三个值类型A,类型B和TypeC

public enum MyType { A, B, C } 

然后在你的类枚举添加另一个属性类型,因为这枚举

public MyType ThreeStateType {get; set;} 

,并代表从旧属性这个新(只有一个吸气剂)...

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

你也可以添加setter如果外部例程需要继续能够设置使用IsTypeA属性的类型...

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

我会避免名称'ThreeStateType'。如果将来有'TypeD'怎么办? (但除此之外,我会做什么)。 – crashmstr 2014-09-12 16:59:14

+0

谢谢大家的一些真正有价值的意见。在这种情况下,我认为@Charles解决方案比我自己的解决方案更简洁,并且运行良好。 – HockeyJ 2014-09-12 18:21:24

1

这取决于是否同时改变供IsTypeA你实际上是在改变其语义意义值的范围。如果是 - 那么你显然是打破了界面的合同,因为IsTypeA是否为true的信息是false与对象的实际状态无关。

因此,如果以前的实现表示,对象是AB从而IsTypeA或者是truefalse,现在的对象可以是ABC本质上仍然是真正中的物体A产量IsTypeA == trueB s和C收益IsTypeA == false然后用@Charles解决方案:在枚举中提供新的详细信息,同时保持向后兼容性。但如果情况并非如此,即对象C既不truefalse(关于IsTypeA),那么你别无选择,只能以合同升级(删除IsTypeA添加枚举ObjectType)。想象一下外部整合读取IsTypeA == false对象C,而事实并非如此。