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

看起来您对每个“文本框”执行相同的逻辑(至少我认为它们是文本框)。我建议将它们全部放入一个集合并执行以下逻辑:

// 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;
    }
}

注意:这确实会稍微改变您的代码,因为我注意到您仅在前一个没有空文本时才检查一个“TextBox”的值。如果你想保持这个逻辑,只需在后面加上一个break;语句textBox.Background = Brushes.LightSteelBlue;,只有第一个空的“TextBox”才会设置它的背景颜色。

于 2012-06-26T13:41:22.630 回答
2

例如对于这个具体案例,您可以

  • 定义一个Dictionary<string, dynamic> dic其中 KEY 是string-value,而 VALUE 是动态的(Name , Age ...whatever)

  • 做 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 回答