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の設定を取得します」。
この 2 つのキー以外を取得する必要がないと確信している場合でも、このアプローチを使用します。言い換えれば、このアプローチが選択されたのは、後の変更を予測するためではなく、意図をよりよく伝えるためです。


ただし、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 つしかないので、間違いなくオプション番号 2 を使用します。将来の変更を期待してこのような決定を下すのは、労力の無駄です。この記事は、存在しない要件に関心を持ちすぎることの危険性を説明するのに非常に役立つことがわかりました。

于 2013-07-10T14:04:40.207 に答える