Неправильно ли использовать временные переменные, чтобы избежать ввода?

Я иногда использую временные переменные, чтобы сократить идентификаторы:

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

Хотя это пример PHP, я прошу в целом:

Является ли эта плохая практика? Есть ли недостатки?

Ответ 1

Этот пример отлично подходит, поскольку вы используете его в функциях/методах.

Переменная будет отменена сразу после завершения метода/функции - так что утечки памяти или чего-то не происходит.

Также, делая это, вы "вроде" реализовали DRY - не повторяйте себя.

Зачем писать так много $this->currentDatabase, когда вы можете написать $db. И что, если вам нужно изменить $this->currentDatabase на некоторые другие значения?

Ответ 2

На самом деле, вы не пытаетесь избежать ввода (иначе вы бы использовали механизм завершения в своем редакторе), но вы просто делаете свою функцию более читаемой (используя "сокращения" ), что является хорошей вещью.

Недостатки появятся, когда вы начнете делать это, чтобы не печатать (и приносить жертву читаемость)

Ответ 3

В общем:

  • Оба $db as $this- > currentDatabase указывают на один и тот же объект.
  • Маленькое пространство, выделенное для $db, освобождается (или illingeable для сбора мусора), когда функция заканчивается

поэтому я бы сказал: нет, это не плохая практика.

Ответ 4

Кажется, я помню, что Стив Макконнелл рекомендует не использовать временные переменные в "Code Complete". Я рискую совершить ересь, я должен не согласиться. Я предпочитаю вводить дополнительную читаемость. Я также добавляю их в помощь одношаговой отладке, а затем не вижу причин для их удаления.

Ответ 5

Это зависит от того, что является контрактом на $this- > currentDatabase. Может ли он измениться в любое время после любого вызова метода? Если он изменится, вы должны продолжать использовать объект, который вы сделали, когда вы сделали свой первый вызов db, или вы всегда должны иметь текущее значение? Это диктует, если вы должны всегда использовать $this- > currentDatabase или если должен всегда хранить его в переменной перед использованием.

Итак, строго говоря, это не вопрос стиля.

Но, полагая, что член никогда не изменяется во время вызовов функций, таких как это, это не имеет никакого значения. Я бы сказал, что хранить его в переменной немного лучше, так как ее легче читать и избегать доступа члена к объекту при каждой операции. Компилятор может оптимизировать его, если это хорошо, но на многих языках такие оптимизации очень сложны - и доступ к локальной переменной почти всегда быстрее, чем доступ к члену объекта.

Ответ 6

Если вы сделаете это тщательно, это абсолютно нормально. Пока вы используете только некоторые из этих переменных в небольшом количестве кода и внутри небольших функций, я думаю, что все в порядке.

Если у вас много этих переменных, и они плохо названы как i, j, l и f в той же функции, то будет понятна понятность вашего кода. Если это так, я бы скорее набрал немного больше, чем не понял код. Это одна из причин того, что у хорошей среды IDE есть автоматическое завершение кода.

Ответ 7

Нет, я думаю, это нормально. Часто производительность, если не такая критическая, как чистый читаемый код.

Кроме того, вы торгуете памятью небольшим удалением по столбцу для более быстрых вызовов методов, избегая дополнительных разыменований.

Ответ 8

Я не думаю, что есть штраф за производительность, если вы используете исходную переменную вместо пропуски первого разыменования ($this->currentDatabase).

Однако, поскольку читаемость значительно улучшается с помощью сокращения, перейдите к нему!

Конечно, это также будет зависеть от ваших правил кодирования команды.