我如何构建我的代码所以我不是硬代码值?

时间:2011-07-28 21:27:26

标签: c#

我有一个执行数据查找并返回值的函数:

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)?如果将来我还有其他需要返回特定值的“幻数”,该怎么办?

6 个答案:

答案 0 :(得分:3)

您可以将值放在配置文件中。您还可以创建自定义配置节并存储一组值,然后在代码中引用它。

如果您对其进行硬编码,请将其存储为名为“IGNORED_METER_NUMBER”的const或类似内容,这将使您的代码更具可读性。

答案 1 :(得分:1)

您可以使用自己的配置文件结构,如下所示:

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

在您的代码中询问映射的“from”属性是否包含密钥x。如果是,请替换该条目的“to”属性值。

答案 2 :(得分:1)

您可以使用web.config或app.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方法。

这也可以通过DataBase,存储值并将它们附加到LoadValues()方法

答案 3 :(得分:1)

您可以在此处遵循一些方案。提到的配置文件方法非常好。此外,如果要连接到数据库,则可以从数据库中提取数字。如果您知道在任何一个值出现时您将返回零,您可以将它们放在一个列表中并执行此操作:

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

答案 4 :(得分:0)

您可以use configuration files存储值,可以是文件资源,也可以是应用程序(或Web).config。

答案 5 :(得分:0)

希望我理解你的问题,所以会尝试做出有用的回应。在某个地方,你不得不声明硬编码的价值。它可以是从ConfigFile读取的数据,也可以是Constants个静态类成员。所以最好不要在代码中使用它们,就像在帖子中写的一样。

如果你怀疑meterNumber不仅仅是这个函数的编号,那么我会说这个特定的例子我会说在集合上推送值,并检查999是该集合的一部分,所以条件满意。

也可能有更复杂的OOP方法,比如调用某些StackIEnumerable上的验证函数,但我个人会避免在我的代码中引入复杂性只是为了获得摆脱硬编码的价值观。

简而言之,我的观点是:如果可能有超过1个值,则使用常量或条件列表。