几乎相同的递归函数

时间:2017-03-31 09:10:14

标签: language-agnostic design-principles

我有一个名为myFunction1的函数,其定义如下:

function myFunction1()
{
    if condition1 then
        doSomething1();
        myFunction1();
    else if condition2 then
        doSomething2();
        myFunction1();
    else if condition3 then
        doSomething3();
        myFunction1();
    else throw Exception;
}

现在我想编写第二个函数myFunction2,除了单个案例外几乎与myFunction1相同,即

function myFunction2()
{
    if condition1 then
        doSomething4();
        myFunction2();
    else if condition2 then
        doSomething2();
        myFunction2();
    else if condition3 then
        doSomething3();
        myFunction2();
    else throw Exception; 
}

请注意,它只是与if不同的第一个myFuction1。我怎么能写myFuction2以避免重复代码?

3 个答案:

答案 0 :(得分:0)

如果它易于阅读和维护,有一些重复是好的!

答案 1 :(得分:0)

如果它是一种功能语言,那么重构它很容易。只需取出差异并将其作为参数传递:

function myGenericFunction1(theThingToDo)
{
    if condition1 then
        theThingToDo();
        myFunction1();
    else if condition2 then
        doSomething2();
        myFunction1();
    else if condition3 then
        doSomething3();
        myFunction1();
    else throw Exception;
}

现在你可以直接使用它:

myGenericFunction1(doSomething1);
myGenericFunction1(doSomething4);

或者使用它来创建两个函数:

function myFunction1 () {
    myGenericFunction1(doSomething1);
}

function myFunction2 () {
    myGenericFunction1(doSomething4);
}

myFunction1();
myFunction2();

答案 2 :(得分:0)

如果它不是函数式语言,您可以将参数添加到单个方法中:

function myFunction(case)
{
    if condition1 then
        if case == 1 then
          doSomething1();
        else
          doSomething4();
        myFunction(case);
    else if condition2 then
        doSomething2();
        myFunction(case);
    else if condition3 then
        doSomething3();
        myFunction(case);
    else throw Exception;
}

或者,根据您的实际情况,将doSomething1 / 4作为函数参数传递可能是有意义的,以避免使用if。当有更多可能性时,这会使代码更简单。