编辑后的属性不能同等地设置为true / false

时间:2009-04-21 09:30:25

标签: properties

很难解释我的问题,所以如果不是很清楚就给我一个休息时间。

我有十个属性可以在视图中编辑。他们中的大多数是布尔人。这些属性配置测试环境(可以配置一个属性来显示解决方案)。

现在,问题是如果其他属性设置为false,则某些属性不能设置为true。没有什么会出错,但它只是没用。这就像一个属性将配置为不显示正确的按钮而另一个属性显示解决方案。在我们的系统中,如果您无法单击正确的按钮,则永远不会显示解决方案。

这种问题有名吗? 这些属性是否有名称(就像有不可变属性一样)? 是否有最佳实践来实现这样的故事?我们可以在视图中对其进行硬编码,但我宁愿使用通用系统。

3 个答案:

答案 0 :(得分:2)

您正在寻找的词是 orthogonality 。设置正交,因为它们不能独立变化。

关于如何处理显示这些属性,完全通用的方法(并且您的问题可能无法保证此泛化的编码成本)将为每个控件提供一个引用其他控件的表达式,如果complete expression的计算结果为true(或false),在视图中禁用该控件。

更容易编码将是一个暴露isDisabled()方法的控件,您可以根据需要覆盖该方法。这是一个简短的Java示例,它利用Java匿名类来完成艰苦的工作。它假定已经有一个Control类,其中booleanValue() getter将其转换为布尔值,并且由于AutoDisabledControl是一个控件,它可以用作替代品对于控制:

  public class AutoDisabledControl extends Control {
    public isDisabled() { return false ; }
  }

  ..... usage ....
  // control1 is never disabled
  final Control1 = new AutoDisabledControl() ;
  // Control2 is disabled if control1 is false
  final Control2 = new  AutoDisabledControl() {
    public isDisabled() { return control1.booleanValue() == false; }
  };
  // conntrol 3 is enabled only if control1 and control2 are true
  final Control1 = new  AutoDisabledControl() {
    public isDisabled() { return ! (
                        control1.booleanValue()
                        && control2.booleanValue()) ; 
  };

当然,在View的显示中,它会检查每个控件的isDisabled(),并禁用返回true的控件;当Control的值更改时,视图会重新显示。我假设某种MVC模式。

答案 1 :(得分:1)

您可以使用int或long来存储相关属性,并在设置属性时使用位掩码以正确清除无效设置。这个int或long可以是带标记的枚举形式。

[Flags]private enum BitValues
{
  Bit1 = 1 << 0, //Inclusive
  Bit2 = 1 << 1, //Exclusive to bit 3 and 4
  Bit3 = 1 << 2, //Exclusive to bit 2 and 4
  Bit4 = 1 << 3, //Exclusive to bit 2 and 3
  ExclusiveBits = Bit2 | Bit3 | Bit4 //All exclusive bits
}

private BitValues enValues;

public bool Bit1
{
  get { return (enValues & BitValues.Bit1) == BitValues.Bit1; }
  set
  {
    //Clear the bit
    enValues = (enValues ^ BitValues.Bit1) & enValues;

    //Set the bit
    enValues = enValues | BitValues.Bit1;
  }
}

public bool Bit2
{
  get { return (enValues & BitValues.Bit2) == BitValues.Bit2; }
  set
  {
    //Clear exclusive bits
    enValues = (enValues ^ BitValues.ExclusiveBits) & enValues;

    //Set bit
    enValues = enValues | BitValues.Bit2;
  }
}

答案 2 :(得分:1)

你可以合理地设计你的解决方案。

尝试以不同的方式思考 - 也许U可以消除一些可以从其他参数中推断出来的参数,或者你可以使用enumarations将几个参数组合成一个参数。

调查参数的值空间以找出它。