【问题标题】:How to simplify long list of similar if statements?如何简化一长串类似的 if 语句?
【发布时间】:2016-01-20 22:29:49
【问题描述】:

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

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

我被指示使用 Sikuli,因此,我知道应用程序当前设置的语言非常重要,这样我的脚本才能点击正确的按钮(这些按钮会根据语言而变化)。

我的想法是代码遍历if/else 语句,然后指向正确的按钮。示例:if/else 语句确定“确定”按钮当前是 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 块的功能?

【问题讨论】:

  • 考虑使用 switch 语句!
  • @TangledUpInBlue 它实际上已经在“ok”的开关中(编辑了那部分,如果这很重要,我会把它扔回去)。所以当我用“ok”参数调用开关时,它会点击正确的“ok”按钮。
  • 我的一般经验法则是如果 if 语句超过 3 行,那么可能有更好的方法来做到这一点,或者我应该使用 private boolean 方法使其可读.我会将其设为isOkPng()method。对于这种情况,弗拉德的回答可能是最好的。
  • 考虑使用地图。
  • 看起来您正在做自己的国际化。也许使用一些标准的 Java 功能进行国际化不仅对这部分代码有帮助,对其他部分也有帮助。 docs.oracle.com/javase/tutorial/i18n

标签: java if-statement


【解决方案1】:

类似:

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;
  }
}

也许?未测试。

【讨论】:

  • 我正要提出同样的建议。丑陋的代码可能会变成漂亮的数据结构。
  • 我认为这是最好的选择。
  • 这工作绝对漂亮。这种类型的数据结构使我不仅可以轻松地迭代“确定”按钮表单,还可以轻松地迭代“取消”表单。它还允许我避免许多代码行,否则这些代码行将是 switchif/else 块。谢谢弗拉德,大开眼界。
  • 列表和地图是非常基本的概念。如果您觉得“这种类型的数据结构”不自然,您应该阅读它们。此外,您应该阅读不要重复自己 (DRY) 原则。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 2014-06-18
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    • 2015-09-12
    相关资源
    最近更新 更多