如何避免代码重复?

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()函数内部调用的方法.(可能在其他编程语言中)

Gra*_*ray 4

对于一个棘手的问题,有一些很好的答案(尤其是@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)

希望其中一些有所帮助,祝你好运。

  • 综合答案+1。尽管我怀疑当你看到他所做的只是控制状态中的流程(中断、返回、继续)时,基于状态的逻辑可以完全重构。 (2认同)