Language agnostic 使用临时变量来避免键入是一种不好的做法吗?

Language agnostic 使用临时变量来避免键入是一种不好的做法吗?,language-agnostic,coding-style,Language Agnostic,Coding Style,我有时使用临时变量来缩短标识符: private function doSomething() { $db = $this->currentDatabase; $db->callMethod1(); $db->callMethod2(); $db->callMethod3(); $db->... } 虽然这是一个PHP示例,但我通常会问: 这种做法不好吗?有什么缺点吗?这个例子非常好,因为您在函数/方法中使用它 该变量将在方

我有时使用临时变量来缩短标识符:

private function doSomething() {
    $db = $this->currentDatabase;
    $db->callMethod1();
    $db->callMethod2();
    $db->callMethod3();
    $db->...
}
虽然这是一个PHP示例,但我通常会问:


这种做法不好吗?有什么缺点吗?

这个例子非常好,因为您在函数/方法中使用它

该变量将在方法/函数结束后立即取消设置-因此不会有太多内存泄漏之类的问题

同样通过这样做,你“有点”干了——不要重复你自己


既然你能写
$db
,为什么还要写这么多
$this->currentDatabase
。如果您必须将
$this->currentDatabase
更改为其他值怎么办?

实际上,您并不是在试图避免键入(否则,您将在编辑器中使用完成机制),而是在使函数更具可读性(通过使用“缩写”)这是一件好事

当您开始这样做以避免键入(并牺牲可读性)时,缺点就会显现出来。

一般来说:

  • $db as$this->currentDatabase都指向完全相同的对象
  • 当函数结束时,为$db分配的小空间将被释放(或可省略以进行垃圾收集)

所以我想说:不,这不是一个坏习惯。

如果你仔细地做这件事,它绝对是好的。只要在少量代码和小函数中只使用其中的几个变量,我认为这是可以的


如果在同一个函数中有很多这样的变量,并且它们的名称很糟糕,比如i、j、l和f,那么代码的可理解性就会受到影响。如果是这样的话,我宁愿多输入一点,也不要有不可理解的代码。这是一个好的IDE能够自动完成代码的原因之一

不,我想,这没关系。通常情况下,性能不如干净可读的代码那么重要


此外,您还可以通过避免额外的去引用来换取更快的方法调用。我似乎记得Steve McConnell建议不要在“代码完成”中使用临时变量。冒着犯下异端的危险,我不得不反对。我更喜欢引入的附加可读性。我还发现自己添加它们是为了帮助单步调试,但没有理由删除它们。

这取决于$this->currentDatabase上的契约是什么。在任何方法调用之后,它是否可以随时更改?如果它发生变化,您是应该继续使用第一次调用db时使用的对象,还是应该始终使用当前值?这决定了是否必须始终使用$This->currentDatabase,或者是否必须在使用前始终将其存储在变量中

因此,严格地说,这根本不是一个风格问题


但是,假设在这样的函数调用过程中成员从未更改,则没有什么区别。我认为将其存储在变量中稍微好一点,因为它更易于读取,并且避免了每次操作时成员对对象的访问。编译器可能会优化它,如果它是好的,但在许多语言中,这样的优化是非常困难的,而且访问局部变量几乎总是比访问对象的成员快。

如果使用原始变量而不是跳过第一次解引用,我不认为会有性能损失(
$this->currentDatabase

然而,由于使用缩写词的可读性有了很大的提高,所以还是去吧


当然,这也取决于您团队的编码约定。

一个getter将解决您的问题:

private function doSomething() {
    getDB()->callMethod1();
    getDB()->callMethod2();
    getDB()->callMethod3();
}

通过清除代码N.

即使如此,变量也会在脚本执行结束后立即取消设置。@HPDeveloper,这不是DRY的意思。DRY是指不在多个位置定义实体,比如在配置文件和源代码中定义常量(而不是从配置文件中读取)。不重复自己的原因是为了避免由于必须进行双重维护(例如更改配置文件中的值,但忘记(或不知道)更改源代码)而出现的错误。我同意你的观点,但不同意McConnell的观点。例如,我也更喜欢使用局部变量而不是多行方法调用。这也使调试更容易,因为你可以检查每个变量的值。这是可以避免的。当你需要一个临时变量时,意味着某些方法名称应该重构,因为它必须重命名为清楚地理解。如果获取$this->CurrentDatabase涉及函数调用(我不懂任何PHP,所以我说不出来),使用临时变量应该更快,因为函数只调用一次。请记住Nakable的答案。提示:在任何需要
$db
的地方,您都必须声明它
$db=$this->currentDatabase;
。如果更改
$db
的实现,您还必须修改此
doSomething()
功能。