Отредактированные свойства, которые не могут быть равны true / false одинаково - PullRequest
2 голосов
/ 21 апреля 2009

Трудно объяснить мою проблему, поэтому сделайте перерыв, если она не очень ясна.

У меня есть около десяти свойств, которые можно редактировать в представлении. Большинство из них являются логическими. Эти свойства настраивают тестовую среду (например, одно свойство можно настроить для отображения решения).

Теперь проблема в том, что некоторые свойства не могут быть установлены в true, если другие установлены в false. Ничего не пойдет не так, но это просто бесполезно. Это как если бы одно свойство было настроено так, чтобы не отображать правильную кнопку, а другое - для отображения решения. В нашей системе, если вы не можете нажать на нужную кнопку, решение никогда не будет отображаться.

У этой проблемы есть имя? У таких свойств есть имя (как и у неизменяемых свойств)? Есть ли лучшие практики для реализации такой истории? Мы можем жестко закодировать его в представлении, но я бы предпочел иметь общую систему.

Ответы [ 3 ]

2 голосов
/ 21 апреля 2009

Слово, которое вы ищете, это ортогональность . Настройки не ортогональны, так как они не могут варьироваться независимо.

Что касается того, как обрабатывать показ этих свойств, то совершенно общий способ сделать это (и ваша проблема может не оправдать затраты на кодирование этой универсальности) состоит в том, чтобы дать каждому элементу управления выражение, которое ссылается на другие элементы управления, где полное выражение оценивается как true (или false), элемент управления отключен в представлении.

Более простым в написании кода будет элемент управления, который предоставляет метод isDisabled(), который можно при необходимости переопределить. Вот короткий пример Java, который использует анонимные классы Java для выполнения тяжелой работы. Предполагается, что уже существует класс Control с геттером booleanValue(), который преобразует его в логическое значение, и поскольку 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; при изменении значения элемента управления представление снова отображается. Я предполагаю что-то вроде MVC Pattern.

1 голос
/ 21 апреля 2009

Вы, вероятно, изуродовали свое решение.

Попытайтесь думать по-другому - возможно, U может исключить некоторые параметры, которые могут быть выведены из других, или вы можете использовать перечисления для объединения нескольких параметров в один.

Исследуйте пространство значений ваших параметров, чтобы выяснить это.

1 голос
/ 21 апреля 2009

Вы можете использовать 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;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...