Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何简化类似if语句的长列表?_Java_If Statement - Fatal编程技术网

Java 如何简化类似if语句的长列表?

Java 如何简化类似if语句的长列表?,java,if-statement,Java,If Statement,我是我公司的自动化工程师。最近,我写了一段代码,我的经理绝对不会接受 我被要求为涉及不同GUI部分的测试用例编写一些脚本。我的经理不会接受的代码部分是if/else语句,用于检查GUI中提示的当前语言 我已被指示使用Sikuli,因此,了解应用程序当前设置的语言非常重要,这样我的脚本就可以单击正确的按钮(根据语言的不同而变化) 我的想法是,代码遍历if/else语句,然后指向正确的按钮。示例:if/else语句确定“ok”按钮当前是Suomi翻译,因此它将单击正确的按钮 下面是我的代码示例: s

我是我公司的自动化工程师。最近,我写了一段代码,我的经理绝对不会接受

我被要求为涉及不同GUI部分的测试用例编写一些脚本。我的经理不会接受的代码部分是
if/else
语句,用于检查GUI中提示的当前语言

我已被指示使用Sikuli,因此,了解应用程序当前设置的语言非常重要,这样我的脚本就可以单击正确的按钮(根据语言的不同而变化)

我的想法是,代码遍历
if/else
语句,然后指向正确的按钮。示例:
if/else
语句确定“ok”按钮当前是Suomi翻译,因此它将单击正确的按钮

下面是我的代码示例:

switch (button) {
case "ok":
    if (s.exists("imagerepo/language/catalan_ok.png") != null) {
                            s.click("imagerepo/language/catalan_ok.png");
                        } else if (s.exists("imagerepo/language/suomi_ok.png") != null) {
                            s.click("imagerepo/language/suomi_ok.png");
                        } else if (s.exists("imagerepo/language/italian_ok.png") != null) {
                            s.click("imagerepo/language/italian_ok.png");
                        } else if (s.exists("imagerepo/language/portuguese_ok.png") != null) {
                            s.click("imagerepo/language/portuguese_ok.png");
                        } else if (s.exists("imagerepo/language/english_ok.png") != null) {
                            s.click("imagerepo/language/english_ok.png");
                        } else if (s.exists("imagerepo/language/dutch_ok.png") != null) {
                            s.click("imagerepo/language/dutch_ok.png");
                        } else if (s.exists("imagerepo/language/spanish_ok.png") != null) {
                            s.click("imagerepo/language/spanish_ok.png");
                        } else if (s.exists("imagerepo/language/french_ok.png") != null) {
                            s.click("imagerepo/language/french_ok.png");
                        } else if (s.exists("imagerepo/language/latina_ok.png") != null) {
                            s.click("imagerepo/language/latina_ok.png");
                        } else if (s.exists("imagerepo/language/chinese_ok.png") != null) {
                            s.click("imagerepo/language/chinese_ok.png");
                        }
break;
...etc..
我对上述代码的唯一不满是它非常难看。在功能上,它完全符合我的要求,100%的时间

编辑:我认为,有一个开关,以适应潜在的变化按钮将优于10开关为同一个按钮。可以说,与我刚才所说的相反,如果我在编写脚本,我将始终知道系统将使用什么语言

如果这是一个糟糕的代码示例,我可以做些什么来确定我需要按下哪个按钮的“形式”

现在值得注意的是,我所寻找的答案实际上根本不涉及测试,而是如何以最佳方式执行上面的
if/else
块的功能?

类似于:

String[] languages = {
  "catalan_ok.png",
  "suomi_ok.png",
  //...
}

for (String base : languages) {
  String file = String.format("imagerepo/language/%s", base);
  if (s.exists(file) != null) {
    s.click(file);
    break;
  }
}

也许吧?未测试。

我假设这是为了国际化,因此您可以为每种语言使用属性文件,然后获得如下图像路径

ResourceBundle bundle = ResourceBundle.getBundle( "messages", userLocale );
s.click(bundle.getString("image"));

考虑使用开关语句!@TangledUpInBlue它实际上已经在一个“ok”的开关中(编辑掉了那个部分,如果这很重要的话,我会把它扔回去)。因此,当我使用“ok”参数调用开关时,它会单击正确的“ok”按钮。我的一般经验法则是,如果if语句占用3行以上的时间,那么可能有更好的方法,或者我应该使用
私有布尔
方法使其可读。我会将其作为
isOkPng()
方法。弗拉德的回答可能是最好的。考虑使用地图。看起来你在做你自己的国际化。也许使用一些标准Java功能进行国际化不仅对这部分代码有帮助,对其他代码也有帮助。我正要提出同样的建议。丑陋的代码片段可能会变成美丽的数据结构。我认为这是最好的选择。这绝对是完美的。这种类型的数据结构使我不仅可以轻松地迭代“ok”按钮表单,还可以迭代“cancel”表单。它还允许我避免许多代码行,否则这些代码行将是
switch
if/else
块。谢谢Vlad,真是大开眼界。列表和地图是非常基本的概念。如果您觉得“这种类型的数据结构”不自然,您应该仔细阅读它们。此外,你还应该仔细阅读“不要重复自己”(干燥)原则。