Вопрос о последовательном счетчике - PullRequest
0 голосов
/ 15 октября 2010

Это больше вопрос дизайна, и мое главное намерение опубликовать здесь - это получить разную информацию о решении проблемы.

Я хочу создать счетчик. Счетчик может быть однозначным (один символ / цифра) или многозначным. Итак, я разработал иерархию следующим образом (читай Ключ = Счетчик):

                              Key
                               |
      -----------------------------------------------
      |                 |             |              |
SingleValueKey    MultiValueKey   NumericKey   AlphaNumericKey
  (there could be further mix and match between these types)

Теперь, когда я проектировал MultiValueKey, я подумал, что могу просто использовать коллекцию n-SingleValueKey для создания счетчика из n символов. Например, Двухзначный (многозначный) счетчик будет использовать массив числовых счетчиков SingleValue размером 2. В конечном итоге я планирую установить буквенно-цифровой набор ключей переменной длины, base 64, для коротких URL-адресов. Числовой контекст - простой пример.

То, что я застрял сейчас, - это «скручивание» или «оборачивание» счетчиков более низкого порядка в увеличивающиеся счетчики более высокого порядка. Например, враг для счетчика из 2 цифр, когда место в единицах достигает 9, следующее число будет, когда места в единицах обернуты до 0, а место в десятках увеличивается на 1.

У меня есть несколько областей, мне нужны ваши отзывы о том, как это сделать:

  1. Счетчики одного значения должны выдавать исключение, когда оно достигает своего максимального значения? Или это должно автоматически обернуться? Или это должно позволить пользователю указать, какой из этих подходов следует использовать?
  2. В случае, если одиночный счетчик должен выдать исключение (как я думаю), должен быть метод «сброса» для сброса счетчика в начало - вызывающий должен обработать исключение и сбросить вызов (до / после того, как оно продолжается) увеличить счетчики более высокого порядка). Это будет хороший дизайн?
  3. Когда счетчик только что инициализирован - новый SingleValueNumericKey () - каким должно быть значение счетчика? Должно ли оно быть готовым к использованию без значения ИЛИ должно ли оно быть первым значением в его наборе значений?
  4. Аналогично предыдущему вопросу, когда вызывается метод "reset", каким должно быть значение счетчика?

Пожалуйста, помогите мне с вашим ценным вкладом здесь. Если у вас есть предложения по самому дизайну, это более чем приветствуется! Если я уберу что-то из этой ветки, я буду ссылаться на это в своих коммитах - так что вы получите кредит за это предложение:)

Спасибо,
Мадхур Танвани

РЕДАКТИРОВАТЬ: Добавлен мой последний вариант использования, чтобы уточнить вопросы Джейсона для всех.

Ответы [ 2 ]

1 голос
/ 15 октября 2010

Создайте каждый счетчик, чтобы узнать о счетчиках более высокого порядка, так что вам нужно взаимодействовать со счетчиком только в одном месте. Вы можете использовать конструктор с указанным количеством цифр, чтобы создать счетчик высшего порядка с одной меньшей цифрой. Когда вы увеличиваете счетчик, вы можете сравнить его с используемой базой (количество значений на цифру), сбросить на ноль и увеличить счетчик выше. Получение значения также может быть выполнено рекурсивно.

Хорошо делать этот дизайн без исключений. Исключения следует использовать в тех случаях, когда существует исключительное обстоятельство, превышающее то, что обычно ожидается. Например, при сбое чтения файла или если сетевой сокет не подключится. Вы не должны использовать исключения для обычных событий, таких как счетчик бросков.

Метод сброса должен сбрасывать все счетчики на ноль, и это значение по умолчанию, которое они должны иметь при инициализации. Фактически, метод сброса может использовать ту же самую связь, так что когда вы вызываете reset на счетчике, он сбрасывает его значение до нуля и вызывает reset на своем более высоком счетчике, если он установлен.

Вы можете использовать этот же дизайн, чтобы абстрагироваться от таких понятий, как конкретные символы, используемые для представления каждого значения. Вы также можете сделать функцию, чтобы получить весь счетчик, заданный в виде строки, рекурсивно, используя абстрактную функцию для символа для каждого значения, чтобы вы могли создавать подклассы так, как вы планировали.

public class Key {
  private Key higherKey;
  private int base;
  private int value;

  public Key(int base, int numberOfDigits) {
    this.base = base;
    if (numberOFDigits > 1)
      this.higherKey = new Key(base, numberOfDigits - 1);
    this.value = 0;
  }

  public int getNumericValue() {
    int value = this.value;
    if (this.higherKey != null)
      value += (this.higherKey.getValue() * this.base);
    return value;
  }

  public void increment() {
    this.value++;
    if (this.value >= this.base) {
      this.value++;
      if (this.higherKey != null)
        this.higherKey.increment();
    }
  }
}
0 голосов
/ 15 октября 2010

Сделайте себе одолжение и создайте несколько вариантов использования, чтобы было понятно, что вам нужно.Если вы просто говорите о N-значных числовых счетчиках, то то, что у вас есть, кажется излишним.Но, возможно, нет.

...