дизайн-шаблон для хранения значения «абсолютное значение xor» - PullRequest
1 голос
/ 16 мая 2011

В записи данных приложения я разрешаю пользователю вставить числовое значение, которое может представлять две разные вещи:

  1. абсолютное значение, скажем 5, означающее, что свойству P должно быть присвоено значение 5
  2. относительное значение, скажем +5, означающее, что свойство P должно быть увеличено на 5

Мой вопрос: какую структуру данных использовать для хранения этой информации? Я предлагаю несколько альтернатив. Моя идея идет с 3-й идеей, но мне интересно, что шаблон "правильный".

1) Здесь абсолютное значение x или значение приращения присваивается, а другое значение равно нулю. Не очень удовлетворительно.

class DoubleFieldBased {
    Integer absolute;
    Integer increment; 
} 

2) Здесь «величина» значения сохраняется в «значение», а логическое «приращение» сообщает, является ли значение абсолютным или относительным. Еще менее удовлетворительно.

class FieldAndBoolean {
    Integer value;
    boolean increment;
}

3) Здесь я переместил фокус на метод applyValue, который использует полиморфизм и делает правильные вещи, основываясь на неявной информации о том, какой класс «я». Удовлетворительно, но немного сложно, и я подозреваю, что картина не идеальна.

public static abstract class AbstractValue {
    int myvalue;
    public AbstractValue (int myvalue) {this.myvalue = myvalue;}
    public abstract int applyValue (int value);
}

public static class Absolute extends AbstractValue {
    public Absolute (int myvalue) {super(myvalue);}
    public int applyValue (int value) {
        return value;
    }
}

public static class Incremental extends AbstractValue {
    public Incremental (int myvalue) {super(myvalue);}
    public int applyValue(int value) {
        return myvalue + value;
    }
}

1 Ответ

1 голос
/ 16 мая 2011

Я бы сказал, использовать Integer или другой числовой тип) и enum, что-то вроде этого:

enum Type{
ABSOLUTE, INCREMENT, PERCENTAGE /* etc */
}

public class Value{
    int /* or float */ numericValue;
    Type type;
}

Вы можете даже использовать перечисление как стратегию:

enum Type{
  ABSOLUTE{
      public int apply(int newValue, int oldValue){return newValue;}
  }, INCREMENT{
      public int apply(int newValue, int oldValue){return oldValue + newValue;}
  } /* etc */
  ;
  public abstract int apply(int newValue, int oldValue);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...