我正在为一个应用程序编写一个C#网络测试项目,该项目将从XML配置文件中读取值并执行自动测试。我现在拥有的代码正在运行,但是,每次更新需求时都必须更改它。
private void takeAction(string keyData, string locator, string action)
{
switch (keyData)
{
case "Origin":
if (action == "Input")
{
origin_input(locator, "MEL");
}
break;
case "Destination":
if (action == "Input")
{
destination_input(locator, "Manila");
}
break;
case "DepartDate":
if (action == "Input")
{
textinput(locator, "21/10/2014");
}
break;
case "ReturnDate":
if (action == "Input")
{
textinput(locator, "06/11/2014");
}
break;
case "Adult":
if (action == "Select")
{
objSelect(locator, "3");
}
break;
case "SearchButton":
if (action == "Button")
{
objClick(locator);
}
break;
...
}
}
此代码与对象的名称匹配,检查所需的操作,然后使用一些参数调用适当的函数。
我已经阅读了一些“开放/封闭原则”的示例,但是,由于同时检查了多个条件,因此无法解决此问题。
随着更多的“ keydata”将被添加到代码中,我相信switch语句在这里似乎不是正确的选择。任何改进此代码的建议将不胜感激。
最佳答案
您可以声明性地定义案例,如下所示。您也可以使用类,但这会变得更加复杂,因为类需要访问您要传递locator
的方法。如果这种方法仍然需要更多的分离,那么可能有必要将每种情况都归为一类。
接口
public delegate void TestAction(string locator);
public class ActionCase
{
public string ExpectedAction { get; set; }
public TestAction Test { get; set; }
}
定义
private Dictionary<string, ActionCase> cases = new Dictionary<string, ActionCase>
{
{
"Origin",
new ActionCase
{
ExpectedAction = "Input",
Test = locator => origin_input(locator, "MEL")
}
},
//Define the rest here
};
用法
private void takeAction(string keyData, string locator, string action)
{
var case = cases[keyData];
if (action == case.ExpectedAction)
case.Test(locator);
}
关于c# - 具有多个条件的switch语句,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26030551/