我完全同意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.
}
虽然这些更可读吗?嗯...可能不是。
我认为减少圈复杂性本身不应该是一个目标。编写可读代码应该。 – svick
是名称,年龄等,多态,还是他们共享一个有用的基类? – GregRos
你确定这是做你想做的事吗?你想只设置一种背景颜色吗?或者您是否希望_every_项目的背景设置为空? – NominSim