2012-02-17 33 views
2

我有一個類爲SortelList私人字段:此列表中的每個元素都有一個string作爲鍵值和自定義數據。當我把我的類的Update方法,我指定的密鑰和數據,以及:如何在自定義方法中處理錯誤的參數值?

  • 如果列表中不包含指定鍵,然後一個新的條目添加到列表中;
  • 否則,當前數據用指定的數據進行更新(因此不會引發異常)。

    public class Cache 
    { 
        private SortedList<string, Data> _list; 
    
        // ... constructors and other methods 
    
        public void Update(string key, Data value, int number) 
        { 
         Data data; 
         if (this._list.TryGetValue(key, out data)) 
         { 
          // update data using value and number 
          // 
          // ... 
    
          _list[key] = data; // overwrite the previous data with the updated data 
         } 
         else 
         { 
          _list.Add(key, value); 
         } 
        } 
    } 
    

因此,此類從未拋出異常,即使您指定的重複鍵。但number參數的值必須是正值,那麼應該忽略小於或等於零的值。有什麼更好的方法來排除這些值?

  • 我可以少忽略值小於或等於零:if (number <= 0) return;
  • 我可以使Update方法返回一個布爾值,所以:if (number <= 0) return false;
  • 我可以使Update方法拋出一個異常時,數量不積極。
+2

如果允許否定,並且應該忽略,則忽略。如果否定是錯誤,則可以通過使數字無符號來消除可能性,使用代碼合約確保它或拋出異常。 – 2012-02-17 11:41:07

+0

恕我直言,似乎沒有「更好的方式」來這個所有選項,你認爲是可行的,都取決於你喜歡的代碼行爲。 – 2012-02-17 11:46:34

+0

@JoachimIsaksson不要忘記,一個uint的最大值是一個int的兩倍,所以如果你使用它,你仍然必須檢查它是否小於int.MaxValue,或者如果你嘗試,你可能會遇到錯誤並將該值轉換爲int。它也會允許爲零。 – 2012-02-17 11:46:34

回答

1

我會拋出一個ArgumentOutOfRangeException,像這樣:

public void Update(string key, Data value, int number) 
{ 
    if (number <= 0) 
    { 
     throw new ArgumentOutOfRangeException("number must be positive"); 
    } 
    // Rest of the method 
} 

這是模式之後,絕大多數的.NET Framework驗證參數時。

另一種方法是讓Update方法返回一個布爾值,指示操作是否成功。這對於允許API的用戶在不引發異常的情況下調用方法很有用(與TryParse方法一樣),但在這種情況下不需要,因爲方法的用戶已經可以輕鬆地避免僅僅通過拋出異常在調用方法之前檢查參數number的值。

1

如上所述,您有很多選項,我建議您將返回值更改爲bool,並返回false以聲明它未更新或拋出ArgumentOutOfRangeException。

返回false的好處很明顯,不會引發異常,但消費者必須確認更新是否發生,否則當訪問該值並發現它沒有更新時會發生混淆。

如果使用異常方法,則可以向該方法添加一個xml註釋,以聲明如果數字爲零或更低時可拋出異常。這將顯示在Visual Studio的工具提示和對象瀏覽器中,以便消費者知道這可能發生。

/// <summary> 
/// Updates the value in the cache for the supplied key. 
/// </summary> 
/// <param name="key">The key in the cache.</param> 
/// <param name="number">The the number to store.</param> 
/// <exception cref="ArgumentOutOfRangeException">Thrown if number is less than 1.</exception> 
public void Update(string key, Data value, int number) 
+0

主要應用程序(使用'Cache'類)應該忽略任何錯誤的參數,因爲負值和零在問題域中毫無意義。主應用程序的用戶應該繼續使用該應用程序,而不顯示錯誤消息:任何錯誤的值可以放在日誌文件中。 – enzom83 2012-02-17 11:58:41