Показать сообщение отдельно
Старый 25.06.2011, 08:19
Zolza вне форума Посмотреть профиль Отправить личное сообщение для Zolza Найти все сообщения от Zolza
  № 4  
Ответить с цитированием
Zolza

Регистрация: Jun 2011
Сообщений: 31
Цитата:
Сообщение от goodguy Посмотреть сообщение
Не представляю, где это может понадобиться в реальности
Представьте: Есть неск-ко функций, использующих определенный набор объектов(переменных). Функции связаны, управляющий элемент ходит туда-сюда по этим функциям. Внутри функций по мере надобности инициализируются некоторые из объектов(переменных):
Код AS3:
function foo1(){
var1 = new var1Class();
var2 = new var2Class();
}
 
function foo2(){
var2 = new var2Class();
}
Чтобы в памяти не плодить кучи новых объектов, рационально их использовать повторно. То есть если объект уже получил значение, то его заново не создаем, а просто меняем необходимые свойства:
Код AS3:
function foo2(){
if(!var2) = new var2Class();
}
Вот на этом месте я задал себе вопрос - я что в каждой подобной foo№() должен такие проверки проводить? Не красиво и громоздко получается. Ладно, если будет одна точка входа в систему функций, там получится, что в любой момент времени известно, какие объекты созданы, и можно ручками написать такие проверки, сведя их к минимуму. А если точек входа несколько?
Цитата:
но у меня вопрос, зачем создавать "пустую" переменную какого-то определенного типа?
Пустые переменные - это еще не получившие значения поля класса, которые свои значения получают в функциях, пример выше.

Тут конечно можно сказать, мол сразу давай всем своим переменным значения и не мучайся. Но зачем мне иметь эти переменные тогда, когда они фактические еще нигде не используются?

Вот и чтобы избавится от копипаста одинаковых проверок, решено было вынести подобный алгоритм в отдельную функцию, которая(спасибо за инфу о нужных функциях) примерно выглядит вот так:
Код AS3:
function checkObj(...objs):void
{
	for(var i:int = 0; i < objs.length; i++)
	{
		if(!objs[i])
		{
			assetClass = getDefinitionByName(getQualifiedClassName(obj[i])) as Class;
			objs[i] = new assetClass();
		}
	}
}
Тут можно улыбнуться и расслабиться, но:

Код AS3:
import flash.display.Sprite;
 
var assetClass:Class;
var spr1:Sprite = new Sprite();
var spr2:Sprite;
 
assetClass = getDefinitionByName(getQualifiedClassName(spr1)) as Class;
trace(assetClass);
// [class Sprite]
 
 
// А если так:
assetClass = getDefinitionByName(getQualifiedClassName(spr2)) as Class;
// ReferenceError: Error #1065: Переменная null не определена.
Итог - переменная null в рамках такого алгоритма не то, чтобы получить значение не может. Даже считать из нее ссылку на класс нельзя. А значит я либо ничего не понял, либо придется оставить наполеоновские планы и решать проблему "в лоб". Мб кто-то с подобным сталкивался и подскажет, что тут еще можно сделать.