如何让这段代码更干?

dav*_*d.s 8 c# dry

假设我们有这些复选框:

  • FooCheckBox
  • BarCheckBox
  • BazCheckBox

而这些方法:

  • 酒吧
  • 巴兹

我只想在选中相应的复选框时调用每个方法.代码可能如下所示:

void DoWork()
{
    if (FooCheckBox.Checked)
    {
        Foo();
        Console.WriteLine("Foo was called");
    }

    if (BarCheckBox.Checked)
    {
        Bar();
        Console.WriteLine("Bar was called");
    }

    if (BazCheckBox.Checked)
    {
        Baz();
        Console.WriteLine("Baz was called");
    }
}
Run Code Online (Sandbox Code Playgroud)

现在考虑使用3个复选框和3个方法,而不是更多.你会如何重写上面的代码使其更

McG*_*gle 7

我会说你提出的情况,保持原样; 你不想在没有充分理由的情况下过度抽象,因为它可以使代码库不易维护.当然,语境很重要,而且它最终是一种判断力.

那就是说,我就是这样做的.创建一个集合,其中每个项目都包含控件和操作委托.然后循环并执行每个项目的逻辑.

var items = new KeyValuePair<CheckBox, Action>[] {
    new KeyValuePair<CheckBox,Action>(FooCheckBox, Foo),
    new KeyValuePair<CheckBox,Action>(BarCheckBox, Bar),
    new KeyValuePair<CheckBox,Action>(BazCheckBox, Baz)
};

foreach (var item in items)
{
    if (item.Key.Checked) 
    {
        item.Value.Invoke();
        Console.WriteLine("Invoked " + item.Value.Method.Name);
    }
}
Run Code Online (Sandbox Code Playgroud)

或者(可能?)更好地使用Linq:

items.Where(item => item.Key.Checked).ToList().ForEach(item => new {
    item.Value.Invoke();
    Console.WriteLine("Invoked " + item.Value.Method.Name);
});
Run Code Online (Sandbox Code Playgroud)


MrW*_*Wuf 6

您可以使用词典来跟上哪些操作引用哪些复选框.然后你可以做以下事情:

foreach(KeyValuePair<CheckBox, Action> kvp in Dict)
{
    if(kvp.Key.Checked)
        kvp.Value.Invoke();
}
Run Code Online (Sandbox Code Playgroud)

  • @odyodyodys OP提出的3种方法也是如此. (2认同)