将(重度使用的)布尔值转换为多个状态值

时间:2014-09-12 16:40:55

标签: c#

我需要更新一个班级。它有一个布尔值,例如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正在更新整个类。我只需要在类中更新一个属性。)

2 个答案:

答案 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 falseA的信息与对象的实际状态无关。

因此,如果先前的实现声明对象是BIsTypeA,因此truefalseA,现在对象可以是BCA仍然基本上是真的对象IsTypeA == true会产生BC s然后IsTypeA == false产生C然后使用@Charles解决方案:在枚举中提供新的详细信息,同时保留向后兼容性。但如果不是这种情况,即对象true既不是false也不是IsTypeA(关于IsTypeA)那么你别无选择,只能升级合同(< strong>删除 ObjectType添加枚举IsTypeA == false)。想象一下,对象C读取{{1}}的外部集成,而事实并非如此。