切换语句具有多个条件

时间:2014-09-25 04:28:54

标签: c#

我正在为一个应用程序编写一个C#Web测试项目,该项目将从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语句似乎不是正确的选项。任何有关改进此代码的建议都将受到赞赏。

4 个答案:

答案 0 :(得分:3)

如果我是你,我会使用某种抽象。例如,您在switch中的单个if语句内调用的所有方法都使用字符串locator和可选的其他字符串参数(或者在最后一种情况下没有)。此外,我认为您可以通过组合keyDataacton参数的值来简化逻辑,因为在组合时它们会产生唯一键。

您可以使用以下方法:

public interface ITestableAction{
    void Execute(string locator);
}

public class OriginInputAction : ITestableAction{
    public void Execute(string locator){
        origin_input(locator, "MEL");  //I'd make the origin_input method static...
    }
}

public class DestinationInputAction : ITestableAction{
    public void Execute(string locator){
        destination_input(locator, "Manila");    
    }
}

最后,您的班级需要有一个字典,其中keyDataacton代表键。

private Dictionary<string, ITestableAction> actions = 
    new Dictionary<string, ITestableAction>();

actions.Add("OriginInput", new OriginInputAction());
actions.Add("DestinationInput", new DestinationInputAction());

等...

因此,在您的方法中,您不必经常检查所有keyDataaction值的配对方式,而只需查找相应的ITestableAction即可:

private void takeAction(string keyData, string locator, string action)
{
   string key = string.Format("{0}{1}", keyData, action);

   if(actions.ContainsKey(key))
   {
      ITestableAction action = actions[key]
      action.Execute(locator);
   }    
}

这是“我应该知道它”的设计模式之一。无法真正指出它究竟是什么,但它很有用。它应该可以帮助你,因为你没有每次都改变逻辑。只需创建一个继承自ITestableAction的新类,并将其添加到字典中。在一天结束时,逻辑树变得更短。但话又说回来,请不要以表面价值看待......有数百种方法可以编写代码,只有你知道自己的要求和赌注。这只是一个建议,希望能指出你正确的方向。

谢谢,

马丁。

答案 1 :(得分:1)

您可以声明性地定义您的案例,如下所示。您也可以使用类,但这会变得更复杂,因为类需要访问您传递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);
}

答案 2 :(得分:0)

嗯,你可以简单地做一些事情:

switch (keyData + action)
{
    case "OriginInput":
        origin_input(locator, "MEL");
        break;
}

答案 3 :(得分:-1)

我认为你只需要一个额外的变量

private void takeAction(string keyData, string locator, string action, string searchfor)
        {
            switch (keyData)
            {
                case "Origin":
                    if (action == "Input")
                    {
                        origin_input(locator, searchfor);
                    }

                    break;