函数/子程序调用的最佳实践

时间:2013-09-17 00:09:37

标签: function subroutine

哪个更好?测试是否应该调用函数然后调用它。或者总是打电话给它,让它决定是否应该进行任何处理?

此:

function myfunction() {
    alert("Hi");
}

if ((a || b) && c) {
   myfunction();
}

或者这个:

function myfunction (a, b, c) {
    if ((a || b) && c) {
       alert("Hi");
    }
}

myfunction();

我问,因为我有很多循环和各种复杂的if语句,然后调用各种函数。我想我应该把测试留在函数之外,以便更好地显示控制流程和非常小的改进处理速度(不是每次调用函数)。

但另一方面,如果测试混乱了我的更高级别的例程,并且总是调用该函数并让它决定做什么似乎直觉上更简单并且包含与该函数中的函数相关联的逻辑。

这只是一个最佳实践问题。感谢。

3 个答案:

答案 0 :(得分:3)

这是一个非常好的问题,在不了解更多关于背景的情况下可能无法正确回答。但是,我会尽力帮助您找到自己的答案。从another answer I saw关于这个主题,据说每个函数都应该遵循单一责任原则,并且如果该函数有责任知道它是否应该自己执行以及它是否有自己的责任工作,可以看出它正在做两件事。

另外,如果我们足够简化问题,我们最终会得到这样的结果:

function (execute) {
    if (!execute) {
        return;
    }
    //other code
}

我必须说看看以前的代码,我没有任何问题可以确定它看起来像是一个糟糕的设计。

到目前为止,似乎我们不应该将这些条件放在函数本身中,但我们仍然希望保留DRY

我要做的是创建另一个函数来封装这个逻辑,这样每个函数都有一个单一的责任,我们仍然不重复自己。另请注意,名称现在更有意义,因为我们不会在有可能执行此操作的情况下调用doThis

function doThisIfNeeded(a, b, c) {
    if ((a || b) && c) {
        doThis();
    }
}

function doThis() {
    //do something
}

答案 1 :(得分:0)

如果if语句总是一样的话,那么为什么要复制它,如果你可以把它放在函数中?没有理由 - 这是创建一个函数的目的,以避免多次重新输入它...它消除了忘记/错误输入事物的机会。此外,如果您需要更改条件或添加其他选项,则无需在任何位置更改它,仅在函数体中。这使代码更容易编辑和维护。

再想一想,拥有一个单独的“警报”功能会更好,它只会在没有任何额外的程序特定事物(这使它可重复使用)的情况下进行警报。您可以在另一个执行该检查的功能中使用它,并在满足条件时发出警报。同样,如果条件真的与你所有(大部分)时间都相同。

function myalert(){
    print("ALERT!!!");
};

function alertifneeded(a, b, c) {
    if ((a || b) && c) {
       myalert();
    }
}

但是,如果大多数测试都不同,那么创建多个函数就没有意义。然后它真的会降低它的可读性而没有任何好处 - 如果每个if语句都不同,那么更改它就没有问题。但即使这样,我也会试着找出能够处理所有情况的一般功能,如果可能的话......

答案 2 :(得分:0)

假设你的例子只是一个例子,而不是真实场景,那么一般来说我会以第一种方式做到这一点,这样你就可以重用这个函数,比如说if ((a > b) && (c < a)) { myfunction(); } 否则你的代码会以50个不同的方式结束函数基本上做同样的事情,只是在它们中有不同的逻辑,它变得很痛苦,但要追踪你需要跟踪调试哪一个。