【问题标题】:Best practice for function/subroutine calls函数/子程序调用的最佳实践
【发布时间】:2013-09-17 00:09:36
【问题描述】:

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

这个:

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

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

或者这个:

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

myfunction();

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

但另一方面,这些 if 测试使我的更高级别的例程变得混乱,并且通过始终调用函数并让其决定要做什么似乎直观更简单,并且包含与该函数中的函数相关联的逻辑。

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

【问题讨论】:

  • 函数的用途和名称通常应该清楚地表明逻辑属于何处。

标签: function subroutine


【解决方案1】:

这是一个非常好的问题,如果不进一步了解上下文,可能无法正确回答。但是,我会尽力帮助您找到自己的答案。来自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
}

【讨论】:

  • 就像我在回答中所说的那样。我完全同意。封装和 DRY 是要走的路。
【解决方案2】:

假设您的示例只是一个示例而不是真实场景,那么是的,一般来说,我会采用第一种方式,这样您就可以重用该函数,例如 if ((a > b) && (c < a)) { myfunction(); } 否则您的代码最终会执行 50 个不同的函数本质上是相同的东西,只是其中有不同的逻辑,但要找出需要追踪的调试对象会很痛苦。

【讨论】:

  • 只是一个例子(一个很简单的例子)。真正的逻辑和功能要复杂得多。
  • 我也这么认为。如果您不熟悉 SOLID,请查看en.wikipedia.org/wiki/SOLID_(object-oriented_design)
  • @Jason 我唯一会选择的情况是,如果这些功能中的每一个只使用一次或两次。否则,您可以编写一个更通用的函数来处理所有情况。正如我在回答中提到的那样,这消除了出错的机会 - 您只需要更改您的功能,而不是在您应用它的所有时间搜索您的代码..
  • 我书中的最佳实践着眼于单一职责和可扩展性。这个警报函数可以被十亿个不同的东西调用,但是如果程序员想要改变警报的文本,他们会在一个地方改变它。
【解决方案3】:

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

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

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

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

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

【讨论】:

  • 我写答案时还没有看到您的编辑。看起来我们有同样的想法;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-17
  • 1970-01-01
  • 1970-01-01
  • 2012-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多