1

哪个更好?测试一个函数是否应该被调用然后调用它。或者总是调用它并让它决定是否应该进行任何处理?

这个:

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

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

或这个:

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

myfunction();

我问是因为我有很多循环和各种复杂的 if 语句,然后调用各种函数。我想我应该将测试留在函数之外,以更好地显示控制流和略微提高的处理速度(不是每次都调用函数)。

但另一方面,这些 if 测试使我的更高级别的例程变得混乱,并且总是调用函数并让它决定做什么,这在直觉上看起来更简单,并且包含与该函数中的函数相关联的逻辑。

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

4

3 回答 3

3

这是一个非常好的问题,如果不了解更多上下文,可能无法正确回答。但是,我会尽力帮助您找到自己的答案。从我在该主题上看到的另一个答案中,据说每个功能都应遵循单一责任原则,并且如果该功能有责任知道它是否应该执行自己并有责任完成自己的工作,则可以看作是它正在做两件事。

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

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

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

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

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

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

function doThis() {
    //do something
}
于 2013-09-17T00:30:32.583 回答
0

假设您的示例只是一个示例,而不是真实场景,那么是的,一般来说,我会以第一种方式进行操作,这样您就可以重用该函数,if ((a > b) && (c < a)) { myfunction(); } 否则您的代码最终会得到 50 个不同的函数,它们做的事情基本相同,只是在它们中具有不同的逻辑,这变得很痛苦,但是要找到您需要跟踪哪个以进行调试。

于 2013-09-17T00:16:35.023 回答
0

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

再想一想,最好有一个单独的“警报”功能,它只会发出警报,而不需要任何额外的程序特定的东西(这使得它可以重用)。您可以在另一个函数中使用它,该函数将在满足条件时执行该检查并发出警报。同样,如果条件真的和你写的所有(大部分)时间一样。

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

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

但是,如果大多数测试都不同,那么创建多个函数是没有意义的。那么它真的会降低它的可读性而没有任何好处——如果你的每个 if 语句都不同,那么改变它就没有问题。但即便如此,我也会尝试找出一些能够处理所有情况的通用功能,如果可能的话......

于 2013-09-17T00:12:45.117 回答