修改 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,存在三种可能的场景(这段代码开始发挥作用)
- 弹出屏幕A
- 弹出屏幕 B
- 不是 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;
}
}
我一直在使用 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,存在三种可能的场景(这段代码开始发挥作用)
- 弹出屏幕A
- 弹出屏幕 B
- 不是 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;
}
}