временные переменные

Я хотел бы знать, в чем разница, когда я пишу такую ​​​​временную переменную (это просто примеры):

версия1

for each tempEnemy in enemyManager.enemies {
var tempX:int = tempEnemy.x;
}

или это:

версия2

for each tempEnemy in enemyManager.enemies {
tempEnemy.oldX = tempEnemy.x;
}

Что не так и правильно? В настоящее время я пишу это как версию 2, и я не уверен, должен ли я изменить ее на версию 1. Может ли кто-нибудь помочь мне с этим, пожалуйста? Я знаю, что большинство разработчиков пишут как версию 1, но я немного сбит с толку, потому что совершенно не знаю о версии 1. Если я использую версию 1, означает ли это, что мое значение явно сохраняется во временной переменной, которая очищается в каждом цикле?


person drpelz    schedule 12.11.2011    source источник


Ответы (2)


В версии 1 объявление:

var tempX:int

определяет переменную, которая существует только до тех пор, пока эта итерация цикла for (или for-each) находится в ней. Каждая итерация tempX определяется с учетом значения из объекта Enemy, и в конце она остается для сборки мусора.

В версии 2 вы ссылаетесь на две переменные, прикрепленные к объекту Enemy, на который ссылается временная переменная с именем tempEnemy.

В обеих версиях ссылка на объект Enemy, tempEnemy, переназначается объекту Enemy следующей итерации.

Каждый метод имеет свои преимущества. С точки зрения памяти версия 2, вероятно, лучше, поскольку она изменяет существующую переменную снова и снова, а не создает новую переменную, которая отбрасывается в конце каждой итерации. С другой стороны, версия 1 не требует, чтобы вы определяли oldX в своих переменных класса, что часто может быть достаточно грязным без таких переменных.

Лучшие практики работы с кодом основаны на (а) работе с другими программистами, которым необходимо уметь читать и понимать код, и (б) выходе из проекта и возвращении к нему позже, когда вам нужно будет уметь читать и понимать собственный код. Для коротких проектов, которыми вы не планируете делиться, подойдет версия 2 (и, возможно, более эффективная с точки зрения памяти), но в любом крупном проекте следует использовать что-то более похожее на версию 1.

Еще одно соображение: собираетесь ли вы использовать эту переменную где-либо, кроме функции, в которой она определена (установлена)? Если нет, вам не нужно хранить его в объекте, который снова указывает на версию 1.

person Martin    schedule 12.11.2011
comment
Большое спасибо! Этот ответ очень подробный и многое упрощает. :) Теперь к вашему вопросу: да, эта временная переменная с именем tempEnemy.oldX нужна и в некоторых других ситуациях (но не всегда). Кода много, и я не планирую отдавать его часть другим разработчикам, потому что сейчас работаю сам. - person drpelz; 13.11.2011

Кроме того... Добавление :variableType (int, String, Number и т. д.) помогает в подсказках и отладке кода.

person Bruce.Norton    schedule 12.11.2011