Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 30.04.2011, 19:37
ShadowsInRain вне форума Посмотреть профиль Отправить личное сообщение для ShadowsInRain Найти все сообщения от ShadowsInRain
  № 1  
Ответить с цитированием
ShadowsInRain
 
Аватар для ShadowsInRain

Регистрация: Mar 2011
Сообщений: 35
По умолчанию Гарантированное удаление объекта

Доброго времени, будущие колеги.

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

Предо мной стоит задача однозначно контроллировать время жизни экземпляров класса в одном месте. Класс не унаследован от DisplayObject, если это важно. При этом ссылки на "подопечные" объекты запланированы в многих местах. Получается, придётся все ссылки извне фабрики делать "слабыми" (динамическими членами, либо элементами массива)? Нет ли более изящного решения для моей задачи?

Вообще, хотелось бы, чтобы можно было создать объект (new) и "отпустить" его, чтобы он сам о себе позаботился (или хотя бы посредством фабрики), чтобы он мог удалить сам себя независимо от того, кто на него ссылается. Может моя ошибка возникла на этом шаге и я поставил неправильную задачу (абзац №3)?

Ещё я узнал, что во флеше нет (автоматических) деструкторов, что причинило мне жуткий баттхёрт и когнитивный диссонанс, но это уже другая тема. Их нет в AS3, по крайней мере.

================================

Обсуждение вышло обширное, поэтому подведу итоги, в кратце.

Предпосылка 1. В песочнице никто не может быть хозяином объекта кроме того, кто его создал, и самой песочницы. Создатель объекта может отпустить его на вольные хлеба, и тогда единственной нитью, которая удерживает его в песочнице, станет сама песочница. Более того, в большинстве случаев объект сразу же становится самостоятельным, и без лишних прорабов начинает функционировать.

Предпосылка 2. Стандартные встроенные ссылки АС3 являются сильными ссылками, т.е. превращают в раба того, на кого они ссылаются, начинают контроллировать его время жизни.

Вывод. Для принципов "песочница" или "равные с равными" встроенные ссылки АС3 не подходят.

Проблема. В АС3 нужен альтернативный тип ссылок (слабые).

Решение. Псевдо-ссылки в виде хендлов, с небольшими частными оптимизациями.


Последний раз редактировалось ShadowsInRain; 05.05.2011 в 17:12. Причина: Итоги
Старый 30.04.2011, 19:51
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 2  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
А разве фабрика не предполагает, что все объекты в ней не будут видны извне? Вообще, вам придется создать свои методы-деструкторы у нужных объектов, где будет зануление ссылки на другой объект. Я советую вам пересмотреть архитектуру приложения, ибо много ссылок в разных местах в фабрике - не есть гуд.
Цитата:
Вообще, хотелось бы, чтобы можно было создать объект (new) и "отпустить" его, чтобы он сам о себе позаботился (или хотя бы посредством фабрики), чтобы он мог удалить сам себя независимо от того, кто на него ссылается.
Нет, такого в ас3 нет. Любая ссылка продлевает жизнь объекту, она является своеобразной цепью на ноге, из-за которой GC не может уничтожить объект.
Цитата:
Предо мной стоит задача однозначно контроллировать время жизни экземпляров класса в одном месте. Класс не унаследован от DisplayObject, если это важно.
Да, это важно, потому что пока объект находится в дисплейЛисте, существует ссылка на него.

Перед непосредственно удалением можно спросить у экземпляра класса, имплементирует ли он интерфейс (это к примеру) IDestroyable и, если да, вызвать у него метод destroy, в котором будут уничтожаться все ссылки на внутренние объекты и все слушатели (при правильной фабрике).
Цитата:
Ещё я узнал, что во флеше нет (автоматических) деструкторов
Почти обо всем нужно заботиться самим
__________________
тут я

Старый 30.04.2011, 20:06
ShadowsInRain вне форума Посмотреть профиль Отправить личное сообщение для ShadowsInRain Найти все сообщения от ShadowsInRain
  № 3  
Ответить с цитированием
ShadowsInRain
 
Аватар для ShadowsInRain

Регистрация: Mar 2011
Сообщений: 35
КорДум, спасибо за инфу. А нельзя ли собрать все ссылки на объект и насильно их занулить?

На счёт фабрики. Если не выпускать объекты из неё наружу, то это получится склеп, а не фабрика. Такого паттерна я ещё не встречал.) Ну или просто внутренние данные. Но к ним же надо как-то иметь доступ из внешнего мира, иначе "склеп" не имеет смысла.

Вот кстати только что появилась идея в качестве слабых ссылок использовать индексы объектов (выдавать каждому новичку GUID), но, по-моему, в этом случае оверхеды и гемморой с постоянными валидациями меня окончательно деморализируют.

Совратили меня знакомые написать серьёзную игру на флеше. Ох уж этот АС3. Если скрипты призваны автоматизировать работу, то АС3, по-моему, наоборот её деавтоматизирует.

Старый 30.04.2011, 20:13
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 4  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
Цитата:
А нельзя ли собрать все ссылки на объект и насильно их занулить?
Ммм... наверно нет. Даже если поместить все в один массив и передавать этот массив по всей фабрике, то, во-первых, это будет "фу", это будет неправильно, во-вторых, сложно в управлении.
Цитата:
Ну или просто внутренние данные. Но к ним же надо как-то иметь доступ из внешнего мира, иначе "склеп" не имеет смысла.
Используйте события. Родитель сказал дитю что-то. Дите слушает и выполняет. Или родитель напрямую вызывает методы дитя. Но если родителю потребуется родителю обратиться к своему внуку (дитю дитя), то нужно будет пройти все ступеньки до внука - событиями или просто вызовом методов сначала у дитя, а затем у внука. А в обратную сторону только события, только ими. Иначе это не фабрика, а не знаю что )
Цитата:
Вот кстати только что появилась идея в качестве слабых ссылок использовать индексы объектов (выдавать каждому новичку GUID)
Вы в разы усложняете себе жизнь
__________________
тут я

Старый 30.04.2011, 20:29
ShadowsInRain вне форума Посмотреть профиль Отправить личное сообщение для ShadowsInRain Найти все сообщения от ShadowsInRain
  № 5  
Ответить с цитированием
ShadowsInRain
 
Аватар для ShadowsInRain

Регистрация: Mar 2011
Сообщений: 35
Цитата:
Сообщение от КорДум Посмотреть сообщение
Вы в разы усложняете себе жизнь
Я не усложняю, я собираюсь писать нетривиальное приложение.)
Объясню с другого бока. Допустим, в игре есть подобие ИИ. Им можно выдавать приказы, причём иногда они требуют аргументов, например, приказать гражданскому бегать за пехотинцем, иначе гражданского сожрут мобы, т.о. образом аргумент — ссылка на пехотинца. При этом пехотинца могут сожрать, и я хочу, чтобы он удалился однозначно, чтобы он убрал все свои спрайты с дисплея (на дисплеее несколько слоёв, для тайлов, теней, мобов, декораций, крыш зданий, обаков и т.п., актёр может заиметь несколько спрайтов на разных слоях), генератор коллизии с физического слоя, своё членство из списка союзников, и так далее.

Как я понял, разработчики АС3 решили, что всем хватит (как когда-то всем должно было хватить 640 килобайт памяти) древовидной иерархии, без перекрёстных ссылок. Это видно по тому, как реализованы эти пресловутые DisplayObject и EventDispatcher.

Я уже понял, что придётся либо вернуться к написанию нативного клиента, либо выдохнуть и распечатать вазелин, но всё-таки тема интересная и не отпускает просто так.

Старый 30.04.2011, 20:33
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 6  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
Мне кажется, вы выбрали не тот паттерн как основной
MVC тут бы очень кстати подошел. К сожалению, я никогда не делал игры, поэтому подсказать, как лучше устроить структуру классов, вам не в силах. А тыкать пальцем в небо, сами понимаете...
Но фабрика - это древовидная структура и есть. Перекрестные ссылки начисто убивают всю прелесть этого паттерна.
__________________
тут я

Старый 30.04.2011, 20:48
zzz7net вне форума Посмотреть профиль Отправить личное сообщение для zzz7net Найти все сообщения от zzz7net
  № 7  
Ответить с цитированием
zzz7net

Регистрация: Mar 2011
Сообщений: 12
AS3 - это вообще жутЪ, AS2 - была проще, без всяких лишних гаджетов и "замут", а делала всё также.


Последний раз редактировалось iNils; 01.05.2011 в 14:34.
Старый 30.04.2011, 21:14
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 8  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
zzz7net, в AVM1, если быть точнее.
__________________
тут я

Старый 30.04.2011, 21:19
ShadowsInRain вне форума Посмотреть профиль Отправить личное сообщение для ShadowsInRain Найти все сообщения от ShadowsInRain
  № 9  
Ответить с цитированием
ShadowsInRain
 
Аватар для ShadowsInRain

Регистрация: Mar 2011
Сообщений: 35
Можно тут на бит подробнее? Возможно, имеет смысл перейти на АС2? Как я понял, он всё-ещё адекватно поддерживается.

Старый 30.04.2011, 21:26
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 10  
Ответить с цитированием
goodguy
Banned
[+1 05.11.11]
[+1 09.08.11]

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
Цитата:
Возможно, имеет смысл перейти на АС2? Как я понял, он всё-ещё адекватно поддерживается.
Смысла нет. Язык уже старый и не развивается.

Создать новую тему Ответ Часовой пояс GMT +4, время: 06:55.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Теги
AS3 , delete , references

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 06:55.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.