【问题标题】:Edited properties who can't be set to true/false equally无法同等设置为真/假的已编辑属性
【发布时间】:2009-04-21 09:30:25
【问题描述】:

我的问题很难解释,如果不是很清楚,请稍候。

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

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

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

【问题讨论】:

  • 这是什么语言/技术?

标签: properties


【解决方案1】:

您要查找的词是正交性。这些设置不是正交的,因为它们不能独立变化。

至于如何处理显示这些属性,完全通用的方法(您的问题可能不保证这种通用性的编码成本)是给每个控件一个引用其他控件的表达式,如果完整表达式的计算结果为真(或假),控件在视图中被禁用。

更容易编写代码的是公开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()) ; 
  };

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

【讨论】:

  • 非常有趣。当然,用户很难知道他必须更改哪个控件才能再次启用另一个控件...
  • 好吧,您可以将其作为静态文本添加到视图中...或者您可以更改 AutoDisabledControl 以显示其被禁用的文本原因。
【解决方案2】:

您可能错误地建模了您的解决方案。

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

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

【讨论】:

  • 确实,我也在考虑这个方向。但这并不是那么简单。如果 A 为真,那么 B 可能是真也可能是假。如果 A 为假,则 B 只能为假。如果 A 设置为 true 并且 B 设置为 true,当 A 更改为 False 时,您是否会自动更改 B?或者当 B 为真时,您是否显示错误说 A 不能为假...
  • "如果 A 为真,那么 B 可以为真也可以为假。如果 A 为假,则 B 只能为假。"在这种情况下,当 A 为真时,在 A 下缩进显示 B,当 A 为假时,隐藏 B 或将其显示为灰色。
【解决方案3】:

您可以使用 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;
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 2020-10-07
    • 2021-12-25
    • 1970-01-01
    相关资源
    最近更新 更多