顺序计数器设计问题

时间:2010-10-15 11:35:04

标签: java counter

这更像是一个设计问题,我在这里发布的主要目的是为问题的解决方案提供不同的输入。

我想要创建的是一个计数器。计数器可以是单值(单个字符/数字)或多值。所以我设计了这样的层次结构(读取Key = Counter):

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

现在在设计MultiValueKey时,我想我可以简单地使用n-SingleValueKey的集合来创建一个n字符计数器。对于例如2位数(多值)计数器将使用SingleValue数值计数器的2号数组。我最终计划的是一个可变长度的字母数字键集,基数为64,用于短网址。数字上下文只是一个简单的例子。

我现在所困扰的是将低阶计数器“滚动”或“包装”为递增的高阶计数器。敌人,例如对于一个2位数的计数器,一旦单位位置达到9,下一个数字将是当单位将回绕到0并且十位增加1时。

我有几个方面需要您就如何做到这一点提出反馈意见:

  1. 单值计数器应在达到最大值时抛出异常?或者它应该自动环绕?或者它应该允许用户指定应该采取哪些方法?
  2. 如果单个计数器应该抛出异常(我认为),应该有一个“重置”方法将计数器重置为开始 - 调用者应该处理异常并调用reset(在它继续之前/之后)增加高阶计数器)。这会是一个好的设计吗?
  3. 刚刚初始化计数器时 - 新的SingleValueNumericKey() - 计数器的值应该是多少?是否可以使用,没有值,或者它应该是其值集中的第一个值吗?
  4. 与上一个问题类似,当调用“重置”方法时,计数器的值应该是多少?
  5. 请在这里帮助我提供宝贵的意见。如果您对设计本身有任何建议,欢迎光临!如果我从这个帖子中拿走一些东西,我将在我的提交中引用它 - 所以你会得到建议的信用:)

    谢谢,周Madhur Tanwani

    编辑:添加了我的最终用例,以澄清杰森对所有人的问题。

2 个答案:

答案 0 :(得分:1)

设计每个计数器以了解更高阶的计数器,因此您只需要与某个地方的计数器进行交互。您可以使用具有指定位数的构造函数来创建具有少一位数的高阶计数器。增加计数器时,可以将其与正在使用的基数(每个数字的值数)进行比较,并重置为零并递增较高的计数器。获取值也可以递归完成。

这种设计没有例外,这是很好的。当存在超出正常预期的特殊情况时,应使用例外情况。例如,当文件读取失败或网络套接字无法连接时。您不应该对正常事件使用例外,例如反滚动。

reset方法应该将所有计数器设置回零,这是初始化时应该具有的默认值。实际上,重置方法可以使用相同的链接,这样当您在计数器上调用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();
    }
  }
}

答案 1 :(得分:0)

帮自己一个忙,创建一些用例,这样就很清楚你需要什么。如果你只是在谈论N位数字计数器,你所拥有的东西似乎有些过分。但也许不是。