在 Java 中对此进行重构的最佳实践是什么?
while (1) {
// initialisation
for (int i = 0; i < MAX_ATTEMPT; i++) {
if (try_something()) goto step2;
}
continue;
step2:
for (int i = 0; i < MAX_ATTEMPT; i++) {
if (try_next_thing()) goto step3;
}
continue;
step3:
...
}
您首先要确定代码试图完成什么:
- 反复执行以下操作:
- 调用 try_something() 最多 MAX_ATTEMPT 次,如果它从未返回 true,则重新启动。
- 调用 try_next_thing() 最多 MAX_ATTEMPT 次,如果它从未返回 true,则重新启动。
然后,编写执行此操作的代码,例如:
while (true) {
int i;
for (i = 0; i < MAX_ATTEMPT && !try_something(); ++ i)
;
if (i == MAX_ATTEMPT)
continue;
for (i = 0; i < MAX_ATTEMPT && !try_next_thing(); ++ i)
;
if (i == MAX_ATTEMPT)
continue;
// etc.
}
还有很多其他方式可以表达这一点。例如,您可以将每个步骤分解为一个方法,并利用 && 将在参数为假时停止计算它的参数这一事实:
boolean doFirstThing () {
int i;
for (i = 0; i < MAX_ATTEMPTS && !try_something(); ++ i)
;
return i < MAX_ATTEMPTS;
}
boolean doSecondThing () {
int i;
for (i = 0; i < MAX_ATTEMPTS && !try_other_thing(); ++ i)
;
return i < MAX_ATTEMPTS;
}
// then, elsewhere
while (true)
doFirstThing() && doSecondThing();
或者其他什么。我不确定我是否会将后者称为“最佳实践”,因为它有点混淆(这并不是说它在某些情况下不合适),但这只是一个例子。一般来说,当移植到另一种语言时:Analyze original -> what is it supposed to do? -> 用目标语言重新实现。优先考虑的是代码的正确性,其次(但紧随其后)是清晰度。