分配新变量与重新使用现有变量的利弊


Pros and cons of assigning new variables vs. re-using exisiting ones

首先,如果这只是一个编码风格问题,我深表歉意。我想知道为每个属性或函数分配一个新变量来重新分配现有变量的利弊。这是假设您不需要访问超出范围的变量。

以下是我的意思(注意名称$var0,...只是为了简单起见),选项#1:

$var0= array('hello', 'world');
$var1="hello world";
$var2=//some crazy large database query result
$var3=//some complicated function()

与。选项2:

$var0= array('hello', 'world');
$var0="hello world";
$var0=//some crazy large database query result
$var0=//some complicated function()
  1. 它是否取决于现有变量的内存大小?也就是说,重新分配内存在计算上比分配新变量更昂贵吗
  2. 这总是一个范围问题吗?这意味着只有当您不需要此处显示的范围之外的每个变量值时,才应该使用选项#2
  3. 它是否取决于每个变量的值?重新分配给不同的数据类型是否会产生不同的相关成本

从技术上讲,重用变量会(不显著)更快。不过,这将对可衡量的绩效产生零差异。

虽然硬件越来越便宜,工作时间也越来越贵,但您应该寻找可维护的代码。从长远来看,这将为你自己和公司节省大笔资金。

只有在可以获得足够性能增益以抵消你投入的工作量(金钱)。

如今,在云和服务器集群中,一位无优化代码最终很可能会导致而不是的项目速度变慢。更有可能的是,你的项目会运行得同样快,但会占用更多的cpu周期,因此会让你的托管提供商多花一点钱。不过,这种轻微的增加成本很可能不会影响长达数小时的性能优化。当然,除非你问这个问题是因为你在为亚马逊开发。(即使在亚马逊这样的地方,每天都有数百万次点击,重复使用变量也不会带来任何显著的性能提升)

回到你的问题上来;我认为只有当一个变量包含原始状态的更新内容时,才应该重用它。但总的来说,这种情况不会发生太多。

我认为在以下情况下,重用$content var是进行的合乎逻辑的选择

function getContent()
{
    $cacheId = 'someUniqueCacheIdSoItDoesNotTriggerANotice';
    $content = someCacheLoadingCall( $cacheId );
    if (null === $content) {
        $content = someContentGeneratingFunction();
        someCacheSavingCall( $cacheId, $content);
    }
    return $content;
}

描述性代码

此外,请善待未来的自己,始终为变量使用描述性名称。你会为此感谢自己的。当你与自己达成协议,除非在逻辑上有意义,否则永远不要重用变量时,你就朝着可维护的代码又迈进了一步。

想象一下,在6个月后,在你完成了另一个大项目或更多的小项目后,你接到一个重要客户的电话,说旧项目中有一个错误。天啊!@#!必须马上解决!你打开门,到处都可以看到这样的功能;

function gC()
{
    $cI = 'someUniqueCacheIdSoItDoesNotTriggerANotice';
    $c  = sclc( $cI );
    if (null === $c) {
        $c = scg_f();
        scsc( $cI, $c);
    }
    return $c;
}

更好的做法是使用描述性变量和函数名,并获得一个具有良好代码完成的代码编辑器,这样您仍然可以随心所欲地快速编码。现在,我推荐Aptana Studio或Zend Studio,Zend有一点更好的代码完成,但Aptana已经被证明更稳定。

PS。我不知道你的编程水平,很抱歉我说得太远了。如果与您无关,我希望能帮助其他可能读到以下内容的人:)

就我个人而言,我认为您永远不应该重新分配一个变量来包含不同的内容。这使得调试变得非常困难。如果你担心内存消耗,你可以随时使用unset()变量。

还要注意,永远不应该有变量名$var#。你的变量名称应该描述它包含的内容。

归根结底,这一切都是为了最大限度地减少代码中的WTF数量。选项二是一个大型WTF。

它是否取决于现有变量的内存大小?也就是说,重新分配内存在计算上比分配新变量更昂贵吗?

这是关于限制你和其他人(重新)查看你的代码的WTF数量。

这总是一个范围问题吗?这意味着只有当您不需要此处显示的范围之外的每个变量值时,才应该使用选项#2?

好吧,如果它在一个完全不同的范围内,如果你使用同一个名字多个名字也没关系。只要清楚变量包含什么,例如:

// perfectly fine to use the same name again. I would go as far as to say this is prefered.
function doSomethingWithText($articleText)
{
    // do something
}
$articleText = 'Some text of some article';
doSomethingWithText($articleText);

它是否取决于每个变量的值?重新分配给不同的数据类型是否会产生不同的相关成本?

不是成本问题,而是可维护性问题。这通常要重要得多。

您应该永远不要使用选项#2。为不相关的代码块重用变量是一种可怕的做法。你甚至不应该处于选项#2是可能的情况。如果你的函数太长,以至于你正在完全改变上下文并处理一些不同的问题,那么你应该将你的函数重构成更小的单用途函数。

您应该永远不要在旧值不再使用后,出于某种"回收"变量的愿望而重复使用变量。如果一个变量不再存在,那么如果您正确地构建软件,它自然会脱离范围。您的决策应该与性能或内存优化无关,这两者都不受变量命名的影响。在选择变量名时,您唯一需要考虑的应该是生成可维护、稳定的代码。

事实上,你甚至在问自己是否要重用变量,这意味着你使用的名称过于通用。像var0var1等变量名都很糟糕。您应该根据变量实际包含的内容命名变量,并在需要存储新值时声明新变量。