繁体   English   中英

如何构造代码,使我不对值进行硬编码?

[英]How Can I Structure My Code So I Don't Hard Code Values?

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

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)来做到这一点? 如果将来我还有其他“魔术数字”需要返回特定值怎么办?

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

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

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

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

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

您可以使用web.config或app.config定义这些值,然后从配置文件中读取这些值并返回它们,例如

创建自定义类,该类将从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()方法中

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

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

您可以使用配置文件将值存储为文件资源,也可以存储在app(或web).config中。

希望我理解您的问题,因此将尝试给出有用的答复。 在某个地方,迟早您必须声明硬编码值。 它可以是从ConfigFile读取的数据,也可以是Constants静态类成员。 因此,最好不要在后期编写的代码中使用它们。

如果您怀疑999不仅是该功能的编号,而且满足条件,那么对于这个特定示例,我想说的是将该值推入集合,并检查meterNumber成为该集合的一部分。

还可能存在更复杂的OOP方法,例如调用某些StackIEnumerable上的验证函数,但我个人将避免在代码中引入这种复杂性,而仅仅是出于摆脱硬编码值的原因。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM