3

この場合、循環的複雑性を減らすために何をしますか

if (Name.Text == string.Empty)
    Name.Background = Brushes.LightSteelBlue;

else if(Age.Text == string.Empty)
    Age.Background = Brushes.LightSteelBlue;

else if(...)
    ...

else
{
    // TODO - something else
}

私が30以上持っているとしましょう。

4

3 に答える 3

3

各「TextBox」で同じロジックを実行しているようです(少なくとも、TextBoxだと思います)。それらすべてをコレクションに入れて、次のロジックを実行することをお勧めします。

// Using var, since I don't know what class Name and Age actually are
// I am assuming that they are most likely actually the same class
// and at least share a base class with .Text and .BackGround
foreach(var textBox in textBoxes)
{
    // Could use textBox.Text.Length > 0 here as well for performance
    if(textBox.Text == string.Empty)
    {
        textBox.Background = Brushes.LightSteelBlue;
    }
}

注:前のテキストボックスに空のテキストがない場合にのみ1つの「テキストボックス」の値をチェックすることに気付いたので、これはコードを少し変更します。このロジックを維持したい場合は、break;ステートメントを後に置くtextBox.Background = Brushes.LightSteelBlue;だけで、最初の空の「TextBox」のみに背景色が設定されます。

于 2012-06-26T13:41:22.630 に答える
2

たとえば、この具体的なケースでは、次のことができます。

  • Dictionary<string, dynamic> dicKEY がstring-valueであり、VALUE が動的である場所を定義します( NameAge ...whatever)

  • do dic[stringValue].Background = Color.LightSteelBlue;

ほんの一例です。

選択するかしないかを選択できますdynamic。より直感的で理解しやすいものかもしれませんが、基本的な考え方は次のとおりです。

if正しい値に基づいたキーを持つ辞書を使用し 、値のように操作/メソッド/オブジェクトを使用します。

お役に立てれば。

于 2012-06-26T13:42:38.247 に答える
0

私は svick のコメントに完全に同意します。場合によっては、次のアプローチが適切な場合があります (ただし、循環的な複雑さを軽減するためではなく、一般的にプラグイン可能な意思決定者を作成するためです)。

public class SwitchAction{
  public Func<bool> Predicate { get; set; }
  public Action TheAction { get; set; }
}

public List<SwitchAction> SwitchableActions = new List<SwitchAction>();

public void InitialiseSwitchableActions()
{
   SwitchableActions.AddRange(new[] {
     new SwitchAction() { Predicate = () => Name.Text == string.Empty, 
                          TheAction = () => Name.Background = Brushes.LightSteelBlue },
     new SwitchAction() { Predicate = () => Age.Text == string.Empty, 
                          TheAction = () => Age.Background = Brushes.LightSteelBlue },
   });
}

public void RunSwitchables()
{
  var switched = SwitchableActions.FirstOrDefault(s => Predicate());

  if(switched != null)
    switched.TheAction();
  else
    //TODO: something else.
}

もちろん、実際にこれらのアクションが相互に排他的でない場合は、最後のメソッドを少し変更する必要があります。

public void RunSwitchables()
{
   bool runCatchAll = true;
   foreach(var switched in SwitchableActions.Where(a => a.Predicate())
   {
     switched.TheAction();
     runCatchAll = false;
   }

   if(runCatchAll)
     //TODO: Something else.
}

これらのどちらかがより読みやすいですか?うーん...おそらくそうではありません。

于 2012-06-26T13:48:27.640 に答える