2011-07-28 32 views
0

我有做了數據查找並返回一個值的函數:我如何構建我的代碼,所以我不努力代碼值?

public int LastBalance(int meterNumber) 
{ 
    // Return value from data access layer 
    return dal.GetLastBalance(meterNumber); 
} 

對於特定meterNumber值我想回到0(零)。

可以嗎?

public int LastBalance(int meterNumber) 
{ 
    if(meterNumber = 999) 
    { 
     return 0; 
    } 
    else 
    { 
     // Return value from data access layer 
     return dal.GetLastBalance(meterNumber); 
    } 
} 

有沒有一種方法,我可以做到這一點沒有硬編碼的值(999在這種情況下)?如果將來我還有其他需要返回特定值的「幻數」呢?

回答

1

您可以使用您的web.config或應用程序。配置來定義這些值,然後讀取配置文件,這些值並返回它們,例如

創建自定義的類,它會從配置讀取值,並返回你真正的價值

public class MeterValues 
{ 
    public static Dictionary<int, int> meterList = new Dictionary<int, int>(); 
    public static int ReturnValue(int meterValue) 
    { 
     if (meterList.Count == 0) 
      LoadValues(); 
     return meterList.ContainsKey(meterValue) ? meterList[meterValue] : dal.GetLastBalance(meterNumber); 
    } 
    public static void LoadValues() 
    { 
     string[] _cValues = ConfigurationManager.AppSettings["Meter.Values"].ToString().Split(','); 
     foreach(string val in _cValues) 
     { 
     string[] _param = val.Split(':'); 
     meterList.Add(Convert.ToInt32(_param[0]), Convert.ToInt32(_param[1]); 
     } 
    } 
} 

所以,你的代碼是這樣的

public int LastBalance(int meterNumber) 
{ 
    return MeterValues.ReturnValue(meterNumber); 
} 

您的配置文件中應該有重點

<add key="Meter.Values" value="121:12,999:0,837:12" /> 

因此對於值123,它將返回12,對於值999,將返回0,對於不在列表中的任何其他值將調用您的dal方法。

這可以通過數據庫,存儲值也不要,只是追加他們LoadValues()方法

+0

不錯,很乾淨。謝謝您的幫助! – DaveB

3

您可以將該值放在配置文件中。您也可以創建一個自定義配置部分並存儲一組值,然後在您的代碼中引用它。

如果您對其進行硬編碼,請將其存儲爲名爲「IGNORED_METER_NUMBER」或類似的常量,這將使您的代碼更具可讀性。

0

希望我明白你的問題,所以會嘗試給出有用的迴應。不久之後,你必須聲明硬編碼值。它可以從ConfigFile讀取數據,它可以是Constants靜態類成員。所以最好不要在代碼中使用它們,就像寫在後期一樣。

這個具體的例子,我會說這個推集合的價值,並檢查meterNumber作爲該集合的一部分,如果你懷疑999將不僅是這個函數的編號,所以條件滿意。

還有可能會更復雜更OOP方法,比如調用驗證功能推一些StackIEnumerable,但我個人會避免在我的代碼介紹,只有理性的複雜性得到從硬編碼值去掉。

總之,我的意見是:使用常數或條件列表,如果可能有更多的1值。

1

您可以使用自己的配置文件結構,像這樣:

<config> 
<mappings> 
    <mapping from="999" to="0"/> 
    <mapping from="123" to="456"/> 
</mappings> 
</config> 

在你的代碼問,如果「從」映射的屬性包含密鑰x。如果是這樣,請用該條目的「to」屬性值替換。

1

有,你可以遵循這裏的幾個場景。提到的配置文件方法很不錯。另外,如果連接到數據庫,則可以從數據庫中提取數字。如果您知道這些值中的任何一個出現時都會返回零,您可以將它們放入列表中,然後執行以下操作:

if(excludeList.Contains(meterNumber)) 
{ 
    return 0; 
}