我正在为一个应用程序编写一个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/

10-13 23:49