【问题标题】:Is it bad practice to use temporary variables to avoid typing?使用临时变量来避免打字是不好的做法吗?
【发布时间】:2009-11-18 11:11:21
【问题描述】:

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

private function doSomething() {
    $db = $this->currentDatabase;
    $db->callMethod1();
    $db->callMethod2();
    $db->callMethod3();
    $db->...
}

虽然这是一个 PHP 示例,但我是在笼统地问:

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

【问题讨论】:

  • 提示:在任何你需要$db的地方,你必须声明它$db = $this->currentDatabase;。如果你改变$db的实现,你也必须修改这个doSomething()函数。

标签: language-agnostic coding-style


【解决方案1】:

这个例子很好,因为你在函数/方法中使用它。

该变量将在方法/函数结束后立即取消设置 - 因此没有太多内存泄漏或什么。

通过这样做,你“有点”实现了 DRY - 不要重复自己。

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

【讨论】:

  • 即便如此,该变量也会在脚本执行结束后立即取消设置。
  • @thephpdeveloper,这不是 DRY 的意思。 DRY 是关于不在多个地方定义实体,例如在配置文件和源代码中定义一个常量(而不是从配置文件中读取它)。不重复自己的原因是为了避免由于必须进行双重维护而出现的错误(例如更改配置文件中的值,但忘记(或不知道)更改源代码)。
【解决方案2】:

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

当你开始这样做以避免打字(并牺牲可读性)时,缺点会出现

【讨论】:

    【解决方案3】:

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

    所以,严格来说,这根本不是风格问题。

    但是,假设在这样的函数调用期间成员从未更改,则没有任何区别。我想说将它存储在一个变量中稍微好一点,因为它更容易阅读并且避免了每次操作时对对象的成员访问。如果它很好,编译器可能会将其优化掉,但在许多语言中,此类优化非常困难 - 访问局部变量几乎总是比访问对象成员快。

    【讨论】:

      【解决方案4】:

      一般:

      • $db 和 $this->currentDatabase 都指向完全相同的对象。
      • 分配给 $db 的小空间在函数结束时被释放(或可用于垃圾回收)

      所以我会说:不,这不是坏习惯。

      【讨论】:

        【解决方案5】:

        我似乎记得 Steve McConnell 建议不要在“代码完成”中使用临时变量。冒着犯异端的风险,我不得不不同意。我更喜欢引入的额外可读性。我还发现自己添加它们以帮助单步调试,然后发现没有理由删除它们。

        【讨论】:

        • 我同意你的观点,不同意 McConnell 的观点。例如,我也更喜欢使用局部变量而不是多行方法调用。它还使调试更容易,因为您可以检查每个变量的值。
        • 这是可以避免的。当您需要一个临时变量时,这意味着应该重构某些方法名称,因为必须对其进行重命名才能清楚地理解。
        【解决方案6】:

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

        但是,由于使用缩写大大提高了可读性,请继续努力!

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

        【讨论】:

        • 如果获取 $this->CurrentDatabase 涉及函数调用(我不知道任何 PHP,所以我不能告诉),使用临时变量应该更快,因为函数只是调用一次。牢记 Nakedible 的回答。
        【解决方案7】:

        如果您仔细执行此操作,那绝对没问题。只要您只在少量代码和小函数中使用其中的几个变量,我认为这是可以的。

        如果你有很多这样的变量,并且它们在同一个函数中被错误地命名为 i、j、l 和 f,那么你的代码的可理解性将会受到影响。如果是这种情况,我宁愿多输入一点,然后没有可理解的代码。这是一个好的 IDE 具有自动代码完成功能的原因之一。

        【讨论】:

          【解决方案8】:

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

          此外,通过避免额外的取消引用,您正在用堆栈上的少量分配命中来换取更快的方法调用。

          【讨论】:

            【解决方案9】:

            getter 会解决你的问题:

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

            通过干净的代码 N。

            【讨论】:

              猜你喜欢
              • 2015-05-31
              • 2011-10-20
              • 1970-01-01
              • 1970-01-01
              • 2012-02-01
              • 1970-01-01
              • 2014-01-19
              • 1970-01-01
              • 2011-08-13
              相关资源
              最近更新 更多