我有一个下拉列表包含"添加"和"减去"。当用户选择任何一个时,它将调用函数Calculate()
private int Calculate(string sAction)
{
int iTotal = 0;
if(sAction == "Add")
{
iTotal = X + Y;
}
else if(sAction == "Subtract")
{
iTotal = X-Y;
}
return iTotal;
}
我不想硬编码来比较动作。它似乎不符合开放封闭原则。如果我更改下拉列表中的文本,我还需要更改该功能。我可以知道如何改进这段代码吗?
答案 0 :(得分:2)
请确保当您的代码具有 if else 链时,应该有改进,所以我的建议:
你可以使用这样的东西:
首先添加一个用于管理您的操作的类:
public class ActionManager : Dictionary<string, Func<int, int, int>>
{
public ActionManager()
{
this.Add("action", (x, y) => x + y);
this.Add("Subtract", (x, y) => x - y);
}
}
然后你可以像这样使用那个类:
public class DoStuff
{
private int Calculate(string sAction)
{
var actionManager = new ActionManager();
var a = 1;
var b = 2;
//var actionResult= actionManager[this should come from your drop down].Invoke(a, b);
var actionResult= actionManager[sAction].Invoke(a, b);
//you can even Register New Action Like this :
actionManager.Add("Multiply",(x,y)=>x*y);
//then you can use it somewhere else:
var multiplyResult = actionManager["Multiply"].Invoke(a, b);
return actionResult;
}
}
因此,每当您的操作发生变化时,您只需在ActionManager中添加新操作即可。如果使用这种方法,则不需要if else语句。
顺便说一句,您甚至可以使用接口和DI来松散耦合ActionManager。
答案 1 :(得分:1)
通过使用Enum,您可以在每次组合框项目文本更改时不改变硬编码值的情况下实现此目的 下面的示例演示如何填充组合框并使用枚举
从组合框中检索值Enum声明
public enum Operation { Add= 0, Subtract= 1 };
填充组合框
cbOperation.DataSource = Enum.GetValues(typeof(Operation ));
根据所选项目执行操作
Enum.TryParse(cbOperation.SelectedValue.ToString(), out Operation selectedOperation);
switch (selectedOperation)
{
case Operation.Add:
Console.WriteLine("Add operation selected");
break;
case Operation.Subtract:
Console.WriteLine("Subtract operation selected");
break;
}
通过这样做,您不需要每次都更改组合框项目文本。您只需更改它在组合框中自动反映的枚举值。