2

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

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

例如:

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

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

代替

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

问题是:

  1. 每种方法是否有任何性能或其他潜在的利弊
  2. 从风格上讲,是否有任何一种方法被认为比另一种更好
4

3 回答 3

2

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

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

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

于 2012-08-22T14:45:36.300 回答
1

@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错误时都不返回任何内容。然后检查盘子是否干净需要我们确保没有错误,但第一种情况不会产生特别可读或自记录的代码。然而,第二种情况通过临时变量添加了关于正在发生的事情的非常明确的信息。在这些情况下,我会说使用变量会更好。

于 2012-08-22T15:08:30.510 回答
0

每种方法是否有任何性能或其他潜在的利弊

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

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

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

于 2012-08-22T14:45:44.660 回答