代码之家  ›  专栏  ›  技术社区  ›  madhurtanwani

顺序计数器设计问题

  •  0
  • madhurtanwani  · 技术社区  · 15 年前

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

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

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

    我现在陷入的困境是将低阶计数器“滚动”或“包装”为递增的高阶计数器。例如,对于2位计数器,一旦单位位数达到9,下一个数字将是单位位数环绕到0,十位数增加1。

    我有几个方面需要您的反馈,以了解如何做到这一点:

    1. 单值计数器在达到其最大值时应引发异常?还是应该自动结束?或者它应该允许用户指定应该采取哪种方法?
    2. 如果单个计数器应该抛出异常(如我所想),应该有一个“reset”方法将计数器重置为开始-调用方应该处理异常并调用reset(在它继续增加高阶计数器之前/之后)。这是一个好的设计吗?
    3. 与上一个问题类似,当调用“reset”方法时,计数器的值应该是多少?

    请在这里帮我提供宝贵的信息。如果你对设计本身有什么建议,那就太好了!如果我从这个线程中删除了一些内容,我将在我的提交中引用它-因此您将获得该建议的信任:)

    谢谢
    马杜尔·塔瓦尼

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

    2 回复  |  直到 15 年前
        1
  •  1
  •   Erick Robertson    15 年前

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

    毫无例外地进行这种设计很好。当出现超出正常预期的异常情况时,应使用例外情况。例如,当文件读取失败,或网络套接字无法连接时。您不应该对正常事件(如反滚动)使用异常。

    重置方法应将所有计数器设置回零,这是初始化计数器时应具有的默认值。事实上,重置方法可以使用相同的链接,以便在调用 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();
        }
      }
    }
    
        2
  •  0
  •   Jason S    15 年前

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

    推荐文章