![]() |
|
||||||||||
|
|||||
|
Регистрация: Mar 2011
Сообщений: 35
|
Доброго времени, будущие колеги.
Читаю официальные доки. Если я правильно понял, то невозможно удалить объект, на который ссылается переменная, являющаяся членом класса. По аналогии с более низкоуровневым программированием, члены класса являются сильными ссылками, а динамические члены класса или элементы массива — слабыми. Предо мной стоит задача однозначно контроллировать время жизни экземпляров класса в одном месте. Класс не унаследован от DisplayObject, если это важно. При этом ссылки на "подопечные" объекты запланированы в многих местах. Получается, придётся все ссылки извне фабрики делать "слабыми" (динамическими членами, либо элементами массива)? Нет ли более изящного решения для моей задачи? Вообще, хотелось бы, чтобы можно было создать объект (new) и "отпустить" его, чтобы он сам о себе позаботился (или хотя бы посредством фабрики), чтобы он мог удалить сам себя независимо от того, кто на него ссылается. Может моя ошибка возникла на этом шаге и я поставил неправильную задачу (абзац №3)? Ещё я узнал, что во флеше нет (автоматических) деструкторов, что причинило мне жуткий баттхёрт и когнитивный диссонанс, но это уже другая тема. Их нет в AS3, по крайней мере. ================================ Обсуждение вышло обширное, поэтому подведу итоги, в кратце. Предпосылка 1. В песочнице никто не может быть хозяином объекта кроме того, кто его создал, и самой песочницы. Создатель объекта может отпустить его на вольные хлеба, и тогда единственной нитью, которая удерживает его в песочнице, станет сама песочница. Более того, в большинстве случаев объект сразу же становится самостоятельным, и без лишних прорабов начинает функционировать. Предпосылка 2. Стандартные встроенные ссылки АС3 являются сильными ссылками, т.е. превращают в раба того, на кого они ссылаются, начинают контроллировать его время жизни. Вывод. Для принципов "песочница" или "равные с равными" встроенные ссылки АС3 не подходят. Проблема. В АС3 нужен альтернативный тип ссылок (слабые). Решение. Псевдо-ссылки в виде хендлов, с небольшими частными оптимизациями. Последний раз редактировалось ShadowsInRain; 05.05.2011 в 17:12. Причина: Итоги |
|
|||||
|
А разве фабрика не предполагает, что все объекты в ней не будут видны извне? Вообще, вам придется создать свои методы-деструкторы у нужных объектов, где будет зануление ссылки на другой объект. Я советую вам пересмотреть архитектуру приложения, ибо много ссылок в разных местах в фабрике - не есть гуд.
Цитата:
Цитата:
Перед непосредственно удалением можно спросить у экземпляра класса, имплементирует ли он интерфейс (это к примеру) IDestroyable и, если да, вызвать у него метод destroy, в котором будут уничтожаться все ссылки на внутренние объекты и все слушатели (при правильной фабрике). Цитата:
![]()
__________________
тут я |
|
|||||
|
Регистрация: Mar 2011
Сообщений: 35
|
КорДум, спасибо за инфу. А нельзя ли собрать все ссылки на объект и насильно их занулить?
На счёт фабрики. Если не выпускать объекты из неё наружу, то это получится склеп, а не фабрика. Такого паттерна я ещё не встречал.) Ну или просто внутренние данные. Но к ним же надо как-то иметь доступ из внешнего мира, иначе "склеп" не имеет смысла. Вот кстати только что появилась идея в качестве слабых ссылок использовать индексы объектов (выдавать каждому новичку GUID), но, по-моему, в этом случае оверхеды и гемморой с постоянными валидациями меня окончательно деморализируют. Совратили меня знакомые написать серьёзную игру на флеше. Ох уж этот АС3. Если скрипты призваны автоматизировать работу, то АС3, по-моему, наоборот её деавтоматизирует. |
|
|||||
|
Цитата:
Цитата:
Цитата:
![]()
__________________
тут я |
|
|||||
|
Регистрация: Mar 2011
Сообщений: 35
|
Я не усложняю, я собираюсь писать нетривиальное приложение.)
Объясню с другого бока. Допустим, в игре есть подобие ИИ. Им можно выдавать приказы, причём иногда они требуют аргументов, например, приказать гражданскому бегать за пехотинцем, иначе гражданского сожрут мобы, т.о. образом аргумент — ссылка на пехотинца. При этом пехотинца могут сожрать, и я хочу, чтобы он удалился однозначно, чтобы он убрал все свои спрайты с дисплея (на дисплеее несколько слоёв, для тайлов, теней, мобов, декораций, крыш зданий, обаков и т.п., актёр может заиметь несколько спрайтов на разных слоях), генератор коллизии с физического слоя, своё членство из списка союзников, и так далее. Как я понял, разработчики АС3 решили, что всем хватит (как когда-то всем должно было хватить 640 килобайт памяти) древовидной иерархии, без перекрёстных ссылок. Это видно по тому, как реализованы эти пресловутые DisplayObject и EventDispatcher. Я уже понял, что придётся либо вернуться к написанию нативного клиента, либо выдохнуть и распечатать вазелин, но всё-таки тема интересная и не отпускает просто так. |
|
|||||
|
Мне кажется, вы выбрали не тот паттерн как основной
![]() MVC тут бы очень кстати подошел. К сожалению, я никогда не делал игры, поэтому подсказать, как лучше устроить структуру классов, вам не в силах. А тыкать пальцем в небо, сами понимаете... Но фабрика - это древовидная структура и есть. Перекрестные ссылки начисто убивают всю прелесть этого паттерна.
__________________
тут я |
|
|||||
|
Регистрация: Mar 2011
Сообщений: 12
|
AS3 - это вообще жутЪ, AS2 - была проще, без всяких лишних гаджетов и "замут", а делала всё также.
Последний раз редактировалось iNils; 01.05.2011 в 14:34. |
|
|||||
|
Регистрация: Mar 2011
Сообщений: 35
|
Можно тут на бит подробнее? Возможно, имеет смысл перейти на АС2? Как я понял, он всё-ещё адекватно поддерживается.
|
|
|||||
|
Banned
[+1 05.11.11]
[+1 09.08.11] Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
|
Цитата:
|
![]() |
![]() |
Часовой пояс GMT +4, время: 06:55. |
|
|
« Предыдущая тема | Следующая тема » |
| Теги |
| AS3 , delete , references |
|
|