0

如果我知道一个方法必须执行一定次数的操作,例如检索数据,我应该编写代码来专门执行所需的次数,还是我的代码应该能够预测以后的更改?例如,假设我被告知要编写一个从字典中检索 2 个值的方法(在这里我称之为设置)并使用提供的已知键返回它们

public Dictionary<string, string> GetSettings()
{
   const string keyA = "address"; //I understand 'magic strings' are bad, bear with me
   const string keyB = "time"
   Dictionary<string, string> retrievedSettings = new Dictionary<string,string>();

    //should I add the keys to a list and then iterate through the list?

    List<string> listOfKeys = new List<string>(){keyA, keyB};
    foreach( string key in listOfKeys)
    {

      if(Settings.ContainsKey(key)
      {
          string value = Setting[key];
          retrieveSettings.Add(key, value);
      }
    }

    //or should I just get the two values directly from the dictionary like so

    if(Settings.ContainsKey(keyA)
    {
        retrievedSettings.Add(keyA , Setting[keyA]);
    }

    if(Settings.Contains(keyB)
    {
        retrievedSettings.Add(keyB , Setting[keyB]);
    }



    return retrievedSettings   
}

我问的原因是代码重复总是一件坏事,即 DRY,但同时,更有经验的程序员告诉我,如果只需要执行操作,则无需编写逻辑来预期更大的循环已知次数

4

2 回答 2

2

我将提取一个将键作为参数的方法:

private Dictionary<string, string> GetSettings(params string[] keys)
{
    var retrievedSettings = new Dictionary<string, string>();
    foreach(string key in keys)
    {
        if(Settings.ContainsKey(key)
            retrieveSettings.Add(key, Setting[key]);
    }
    return retrievedSettings;
}

您现在可以像这样使用此方法:

public Dictionary<string, string> GetSettings()
{
    return GetSettings(keyA, keyB);
}

我会选择这种方法,因为它使您的主要方法易于理解:“啊哈,它获取了 keyA 和 keyB 的设置”。
即使我确信我永远不需要获得比这两个密钥更多的密钥,我也会使用这种方法。换句话说,之所以选择这种方法,不是因为它预测了以后的变化,而是因为它更好地传达了意图。


但是,使用 LINQ,您实际上并不需要提取的方法。你可以简单地使用这个:

public Dictionary<string, string> GetSettings()
{
    return new [] { keyA, keyB }.Where(x => Settings.ContainsKey(x))
                                .ToDictionary(x => x, Settings[x]);
}
于 2013-07-10T14:04:02.927 回答
1

DRY 原则并不一定意味着程序中的每一行代码都应该是唯一的。它只是意味着您不应该在整个程序中散布大量代码以执行相同的操作。

当您要搜索大量项目时,选项 1 效果很好,但缺点是使代码阅读起来稍微不那么琐碎。

当您有少量选项时,选项 2 效果很好。它更直接,实际上更有效。

由于您只有两个设置,我肯定会选择选项 2。做出这样的决定以期待未来的变化是浪费精力。我发现这篇文章非常有助于说明过于关注不存在的需求的危险。

于 2013-07-10T14:04:40.207 回答