【问题标题】:Coding Style: function calls inside statements编码风格:语句内的函数调用
【发布时间】:2012-08-22 14:40:38
【问题描述】:

好的,首先,我怀疑这将被关闭。

是的,我有一个关于在语句中使用函数调用而不是先分配给变量的问题。

例如:

(代码在php中,但问题普遍适用。另外,代码过于简化)

if (myAmazingFunction() === true) {
    // do something amazing
}

而不是

$amazingresult = myAmazingFuncton();
if ($amazingResult === true) {
    // do something amazing
}

问题是:

  1. 每种方法是否有任何性能或其他潜在的优缺点
  2. 在风格上,任何一种方法都被认为比其他方法更好

【问题讨论】:

  • 如果检查 true 始终使用 === 是 1 条经验法则!
  • 两者都有效;听听@Zac。比较布尔值时使用===(除非您只想要truthyfalse-y,在这种情况下== 很好)。
  • 如果您以后不需要结果,则无需将结果保存在变量中;-))。两个版本都是完全合法的:-)
  • 我总是会做第二个,您可能需要在脚本中进一步检查结果并且您不想重新运行该函数。

标签: php optimization coding-style


【解决方案1】:

在大多数语言中,不会有性能差异。在第一种情况下,编译器会先为函数调用的结果分配存储空间,然后再检查它是否为true。在第二种情况下,您只是将其明确化。

如果您正在调试,有时第二种形式更容易,因为您可以在第二行设置断点并在进行比较之前检查函数返回的值 - 但随后您会看到函数的结果在您给出的示例中,执行代码无论如何都会采用路径。正如 Zac 在他的评论中所说,您还可以在不重新运行函数的情况下重复使用该值。

从风格上讲,这在很大程度上是主观的。我在这里要说的唯一一件事是,如果您的变量名称使函数输出的目的明确,那么您可能会添加一些东西,使其他人能够轻松理解您的代码。

【讨论】:

    【解决方案2】:

    @DavidM 的回答是正确的。不过,我只是想从风格上补充一点,我认为这取决于函数的名称及其上下文。

    例子:

    if ($food->tastesGood()) {
        echo 'Mmmm!';
    }
    
    // vs.
    
    $foodTastesGood = $food->tastesGood();
    if ($foodTastesGood) {
        echo 'Mmmm!';
    }
    

    在这种情况下,很明显,方法 tastesGood() 的返回值将是方法名称及其上下文的布尔值。使用临时变量不会给你的代码增加任何东西,只会让它变得多余且一目了然。另外,如果变量在使用之前没有定义,那么你必须去找到定义来理解条件。在这些情况下,我会说使用变量会更糟。

    另一个例子:

    if ($dishes->wash() !== FALSE) {
        echo 'Sparkly!';
    }
    
    // vs.
    
    $dishesAreClean = $dishes->wash() !== FALSE;
    if ($dishesAreClean) {
        echo 'Sparkly!';
    }
    

    在这种情况下,我们无法从其名称中真正推断出wash() 方法的返回类型,实际上,它似乎在成功时不返回任何内容,而在错误时似乎不返回FALSE。然后检查盘子是否干净需要我们确保没有错误,但第一种情况不会产生特别可读或自记录的代码。然而,第二种情况通过临时变量添加了关于正在发生的事情的非常明确的信息。在这些情况下,我会说使用变量会更好。

    【讨论】:

      【解决方案3】:

      每种方法是否有任何性能或其他潜在的优缺点

      在性能方面,分配一个仅在 if 条件中使用的额外变量将使用额外的内存和一行无用的代码。所以它会使用更多的内存。会引人注目吗?应该不会吧。

      在风格上,是否有任何方法被认为是不好的

      if 语句中使用该方法是完全有效的,我认为这是一种更好的方法,因为您可以阅读代码并准确查看在if 条件下测试的值。无需查找变量并搜索受影响的位置。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-06
        • 1970-01-01
        • 1970-01-01
        • 2012-09-28
        • 2019-04-19
        • 2012-07-26
        • 2019-01-14
        • 2021-06-18
        相关资源
        最近更新 更多