修改 try-catch 语句以减少笨重的代码

Modifying try-catch statements to reduce clunky code

我一直在使用 SikuliX 来尝试一些 ATDD。当只有 I 是使用它的代码时,该代码运行良好。然而,无论我如何评论代码,将下面的代码转移给其他人只会适得其反。

int numOfTries;
while (!isFinishStage && numOfTries != 3) {
                numOfTries++;
                try {
                    temp = new Pattern("imgs/img1.png").similar(0.9f);
                    s.wait(temp, 1);
                    s.find(temp);
                    s.hover(temp);
                    isFinishStage = true;
                    break;
                }catch (FindFailed ff1) {
                    try {
                    temp = new Pattern("imgs/img2").similar(0.5f);
                    s.wait(temp, 1);
                    s.find(temp);
                    s.hover(temp);
                    isFinishStage = true;
                    break;
                } catch (FindFailed ff2) {
             try{
                    temp = new Pattern("imgs/img3");
                    s.wait(temp, 1);
                    s.find(temp);
                    s.click(temp);
                } catch (FindFailed ff3) {
                    continue;
             }
        }
    }
}

一旦 pattern/image 无法与屏幕上的任何内容匹配,就会抛出 FindFailed 异常(相似性只是调整容差级别)。对于当前自动化的 GUI,存在三种可能的场景(这段代码开始发挥作用)

  1. 弹出屏幕A
  2. 弹出屏幕 B
  3. 不是 1 或 2,而是 'Next' 弹出

因此我们检查 Screen A,如果不检查 Screen B,如果不检查 Next,如果不检查,重复循环直到超过尝试次数— 表示测试失败。

根据 Sikuli 的工作方式或至少我一直在解释它的方式,您将不得不通过多个 try-catch 语句执行各种循环,这似乎有点不合时宜。

PS: 上面代码背后的想法就是让它工作。如果有任何歧义,请告诉我,以便我澄清。

我希望你在课后阅读软件原理并使你的代码整洁:

10 Object Oriented Design Principles

在此之后,您应该了解 DRY 和 KISS 原则等基础知识,它们应该很好地融入您发布的代码中。

方法如下:

String [] patterns = {
    "imgs/img1",
    "imgs/img2",
    "imgs/img3"
};

float [] similarities = {
    0.9f,
    0.5f,
    0.1f
};

for(int i=0; i<patterns.length; i++) {
    String str = patterns[i];
    try {     
        float sim = 0.1; // default
        try {
            sim = similarities[i];
        } catch (IndexOutofBoundsException e) {;}     
        temp = new Pattern(str).similar(sim);
        s.wait(temp, 1);
        s.find(temp);
        s.hover(temp);
        if(i != patterns.length - 1){ // Different last case
            isFinishStage = true;
            break;
        }
    } catch (FindFailed ff) {
        continue;
    }
}

以下代码(我认为)等同于您的代码:

int numOfTries;
while (!isFinishStage && numOfTries < 3) {
    numOfTries++;
    if (tryPattern(s, "imgs/img1.png", 0.9f) ||
        tryPattern(s, "imgs/img2", 0.5f)) {
        isFinishStage = true;
    } else {
        // Note that the third "attempt" is inconsistent with
        // the others because you don't set isFinishedStage.
        tryPattern(s, "imgs/img3", 1.0f)
    }
}

private boolean tryPattern(SomeClass s, String path, float similarity) {
    try {
        Pattern temp = new Pattern(path);
        if (similarity != 1.0f) {
            temp = temp.similar(similarity);
        }
        s.wait(temp, 1);
        s.find(temp);
        s.hover(temp);
        return true;
    } catch (FindFailed ff) {
        return false;
    }
}