2010-10-15 71 views
0

這更像是一個設計問題,我在此發佈的主要目的是獲得關於問題解決方案的各種輸入。連續計數器設計問題

我想創建的是一個計數器。計數器可能是單值(單個字符/數字)或多值。所以我設計了這樣一個層次(READ鍵=計數器):

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

現在在設計MultiValueKey,我以爲我可以簡單地使用正SingleValueKey的集合來創建一個正字符計數器。對於例如一個2位(多值)計數器將使用一個大小爲2的SingleValue數值計數器的數組。我最終計劃的是一個可變長度的字母數字鍵集,基數爲64,適用於短網址。數字上下文只是一個簡單的例子。

我現在被卡住的是低階計數器的「滾動」或「包裹」到遞增更高階的計數器中。敵人,例如對於一個2位數的計數器,一旦單位位置達到9,下一個數字將在單位位置繞回到0並且十位增加1.

我有幾個方面需要您對如何反饋應該這樣做:

  1. 單值計數器應該在它達到其最大值時拋出異常?還是應該自動換行?還是應該允許用戶指定應採取哪些方法?
  2. 如果單個計數器應該拋出一個異常(我認爲),應該有一個「重置」方法將計數器重置爲開始 - 調用者應該處理異常並調用重置(在它開始之前/之後)以增加更高階的計數器)。這會是一個很好的設計嗎?
  3. 當計數器剛剛初始化時 - 新的SingleValueNumericKey() - 計數器的值應該是多少?它是否應該準備好使用,沒有價值,或者它應該是它的價值集中的第一個價值?
  4. 類似於prev問題,當調用「reset」方法時,計數器的值應該是多少?

請幫助我在這裏輸入您的寶貴意見。如果您對設計本身有任何建議,歡迎!如果我拿走從這個線程的東西,我要提到它在我提交 - 這樣你纔會有信用的建議:)

謝謝
Madhur Tanwani

編輯:添加我的最後用例來澄清傑森的所有問題。

回答

0

幫你一個忙,創建一些用例,所以你很清楚你需要什麼。如果你只是在談論N位數字計數器,你看起來像是過度殺傷。但也許不是。

+0

我最終計劃的是一個字母數字鍵集,基數爲64,適用於短網址。數字上下文只是一個簡單的例子。 – madhurtanwani 2010-10-15 11:39:44

1

設計每個櫃檯以瞭解更高階的櫃檯,所以你只需要在櫃檯上與某個地方互動。您可以使用具有指定位數的構造函數來創建較少的數字的更高位計數器。當您增加計數器時,您可以將其與正在使用的基數(每位數值的數量)進行比較並將其重置爲零並遞增較高的計數器。獲取值也可以遞歸地完成。

很好地做這個設計沒有例外。在出現例外情況時應使用例外情況,超出通常預期的情況。例如,當文件讀取失敗,或者網絡套接字不能連接時。您不應該將異常用於計數器滾動等正常事件。

重置方法應該將所有計數器都設置爲零,這是它們在初始化時應該具有的默認值。實際上,重置方法可以使用相同的鏈接,因此當您在計數器上調用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

感謝您對異常和重置的意見。 我認爲應該拋出一個異常的原因是,一個數字/字符計數器在達到其最大限制時應該不知道應該完成什麼(除非明確指定 - 哪一個將是其他設計)。 但我同意 - 你對異常使用的建議確實有道理。謝謝! – madhurtanwani 2010-10-15 11:51:57

+1

在這種情況下,您可以使用觀察者模式來通知溢出事件的高階計數器。 – 2010-10-15 11:56:26

+0

但是,我不確定「連接」模式是否合適。單個數字計數器知道的應該比它應該運作的更多。 一位同事的建議是使用Mediator模式 - 在n-SingleValueKey對象的頂部有一個人。每當單一價值的櫃檯滾動時,它應該與調解員(導演和GoF一樣)親密。調解員應該決定下一步做什麼 - 你認爲怎麼樣? – madhurtanwani 2010-10-15 11:56:42