SeM*_*eKh 5 java design-patterns code-duplication flow-control
在这种情况下是否可以避免代码重复?(Java代码)
void f()
{
int r;
boolean condition = true;
while(condition)
{
// some code here (1)
r = check();
if(r == 0)
break ;
else if(r == 1)
return ;
else if(r == 2)
continue ;
else if(r == 3)
condition = false;
// some code here (2)
r = check();
if(r == 0)
break ;
else if(r == 1)
return ;
else if(r == 2)
continue ;
else if(r == 3)
condition = false;
// some code here (3)
}
// some code here (4)
}
int check()
{
// check a condition and return something
}
Run Code Online (Sandbox Code Playgroud)
可能的解决方案可能是使用例外,但这似乎不是一个好的做法.在这种情况下,是否有任何所谓的良好的程序流程控制模式?例如,一种break ;从check()函数内部调用的方法.(可能在其他编程语言中)
对于一个棘手的问题,有一些很好的答案(尤其是@Garrett 刚刚的答案),但我会为后代添加 0.02 美元。
关于如何在不看到实际代码的情况下重构这个块,这里没有简单的答案,但我对此的反应是它需要重新设计。
例如,调用break的方法;从 check() 函数内部。(可能是其他编程语言)
如果您要求 Java 不支持的不同中断(无需破解),并且具有重复的check()和各种不同的循环退出/重复代码,则向我表明这是一个大型且复杂的方法。以下是一些想法供您思考:
每个some code here块都在做一些事情。如果将它们拉出到它们自己的方法中,这会如何改变循环?
也许将循环分解为一系列注释。不要深入研究代码,而是从概念上考虑一下,看看是否会出现不同的配置。
您的组织中是否有其他未参与此代码的开发人员查看过该代码?如果您详细解释代码如何工作,某人可能会看到一些您看不到的模式,因为您处于杂草之中。
我还认为@aix 的有限状态机的想法是一个很好的想法,但我在我的编程之旅中很少需要使用这种机制——主要是在模式识别期间。我怀疑重新设计代码并将更小的代码块引入方法将足以改进代码。
如果您确实想实现状态机,这里有一些更多细节。您可以有一个仅运行调用方法的单个 switch 语句的循环。每个方法都会返回开关的下一个值。这与您的代码不完全匹配,但类似于:
int state = 0;
WHILE: while(true) {
switch (state) {
case 0:
// 1st some code here
state = 1;
break;
case 1:
state = check();
break;
case 2:
return;
case 3:
break WHILE;
case 4:
// 2nd some code
state = 1;
break;
...
}
}
Run Code Online (Sandbox Code Playgroud)
希望其中一些有所帮助,祝你好运。
| 归档时间: |
|
| 查看次数: |
1955 次 |
| 最近记录: |