Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   перебрать вложенные объекты movieClip (http://www.flasher.ru/forum/showthread.php?t=207487)

faraday 19.04.2014 11:43

перебрать вложенные объекты movieClip
 
Здравствуйте, хочу написать обертку к starling которая будет конвертировать movieClip созданные в flashIde в sprite starling с сохранением иерархии объектов. Но сразу возникла проблема что не получается перебрать циклом вложенные в MC объекты
Код AS3:

                        var t2:testSprite = new testSprite();
                        for (var i in t2)
                        trace(i);

Это как нибудь можно обойти. или идея обречена на провал?

caseyryan 19.04.2014 12:02

А почему перебор таким образом осуществляется? Это же не массив.
Нужно использовать getChildAt в цикле

faraday 19.04.2014 13:11

Действительно, не подумал, спасибо)
Еще не большой вопрос, можно ли как то расширить starling.sprite?если создать public var o:Object={};
и обращаться ко всем вложенным объектам через него. Но хотелось бы обращаться напрямую и заносить объекты как this[name]=value; Возможно ли это?

caseyryan 19.04.2014 17:33

В чем проблема-то? Старлинг работает по общему принципу ООП. Если класс не final (а starling.display.Sprite не final), то его можно расширить.
п.с. public var o:Object={}; противоречит принципу инкапсуляции. Надо делать через геттеры и сеттеры. Не должны внешние объекты напрямую обращаться к свойствам другого объекта

PainKiller 22.04.2014 13:06

Цитата:

п.с. public var o:Object={}; противоречит принципу инкапсуляции. Надо делать через геттеры и сеттеры. Не должны внешние объекты напрямую обращаться к свойствам другого объекта
это просто нездоровый фанатизм инкапсуляции, я думаю все таки большинство программистов используют public var, а геттеры и сеттеры ставят только когда надо защитить/проверить/сделать дополнительное действие при присвоении и тому подобных случаях.

ZackMercury 22.04.2014 13:19

Цитата:

Сообщение от PainKiller (Сообщение 1164213)
это просто нездоровый фанатизм инкапсуляции, я думаю все таки большинство программистов используют public var, а геттеры и сеттеры ставят только когда надо защитить/проверить/сделать дополнительное действие при присвоении и тому подобных случаях.

Это "большинство" наверняка ничего нормального не напишет)

caseyryan 22.04.2014 14:31

Цитата:

только когда надо защитить/проверить/сделать дополнительное действие при присвоении и тому подобных случаях.
Каковых как раз большинство. Инкапсуляция - это хорошо. Никакого фанатизма в этом нет. Это просто правильный подход.
Я признаю public var только в тех случаях, когда какой-то класс используется исключительно для создания объектов "хранилищ", то есть использование динамиков типа Object не подходит из-за необходимости четкой типизации передаваемых данных.
Цитата:

я думаю все таки большинство программистов используют public var
Очень сомневаюсь

Akopalipsis 22.04.2014 14:34

Цитата:

public var только в тех случаях, когда какой-то класс используется исключительно для создания объектов "хранилищ"
А если нужна скорость? Мне лично безразлично ОПП, когда нужна скорость.

caseyryan 22.04.2014 15:05

Цитата:

А если нужна скорость?
Тогда использовать C++, а не as3.

Akopalipsis 22.04.2014 15:10

Цитата:

Тогда использовать C++, а не as3.
Тогда откажитесь от анимации и ещё половины фраймворков, так-как там не используют геттеры-сеттеры.

ZackMercury 22.04.2014 15:20

Цитата:

Сообщение от Akopalipsis (Сообщение 1164237)
Тогда откажитесь от анимации и ещё половины фраймворков, так-как там не используют геттеры-сеттеры.

Вы уверены?

caseyryan 22.04.2014 15:22

Цитата:

Сообщение от Akopalipsis (Сообщение 1164237)
Тогда откажитесь от анимации и ещё половины фраймворков, так-как там не используют геттеры-сеттеры.

Дану? Примерчик можно?

Akopalipsis 22.04.2014 15:35

В анимации у TweenMax класс PropTween и чтобы не перечислять можно просто сказать, что напрямую к свойствам обращаются везде, где используется паттерн wrapper. А его почти всегда используют там, где нужна скорость. И не факт, что классы делают приватными.

caseyryan 22.04.2014 15:53

Цитата:

И не факт, что классы делают приватными.
В ас3 вообще нет приватных классов. Тут есть только public и internal
Цитата:

В анимации у TweenMax класс PropTween
Это хранилище свойств. Я об этом говорил выше
Цитата:

Я признаю public var только в тех случаях, когда какой-то класс используется исключительно для создания объектов "хранилищ"

in4core 22.04.2014 16:47

Да большинство тут будут согласны с caseyryan - о чем речь то вести. Я вообще не помню , когда посл раз использовал public var , наверное только когда о ней узнал )))) По сабжу даже хранилище данных не всегда ( в размере будущей расширяемости ) стоит набивать пабликами, а вдруг в будушем придется оформить алгоритм для ведения переменной? А сделать гет-сет только для одной остаиви везде паблик - моветон, шлюха тон, я бы даже сказал.
В конфиге еще можно
Код AS3:

public class Config 
public static var server:String
public static var width:int;

И то, в данном случае статик все равно :)

Akopalipsis 22.04.2014 17:06

Цитата:

Это хранилище свойств. Я об этом говорил выше
Сорри, что вступил в спор не поняв о чем Вы сказали. Так да, я полностью тоже поддерживаю Ваши слова.

silin 22.04.2014 17:34

Цитата:

Сообщение от caseyryan (Сообщение 1164224)
Каковых как раз большинство. Инкапсуляция - это хорошо. Никакого фанатизма в этом нет. Это просто правильный подход.
Я признаю public var только в тех случаях, когда какой-то класс используется исключительно для создания объектов "хранилищ", то есть использование динамиков типа Object не подходит из-за необходимости четкой типизации передаваемых данных.

Очень сомневаюсь

бессмысленный, конечно, разговор, бо каждый пишет как ему удобнее,
но никогда не понимал оборачивание свойств в get\set ради какого-то абстрактного 'правильного подхода'
read\write only, отследить, проверить, загнать в интерфейс - это мне понятно, а в чем смысл голой оберки как-то не очень: геттер-сеттер предоставляет такой же доступ к данным, правда 'слегка' (где-то на порядок) замедляя его, ну и в чем смысл этого, особенно во флеше, где производительность завсегда была больным местом..

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

>>а вдруг в будушем придется оформить алгоритм для ведения переменной?

что-то помешает заменить прямой доступ на аксессор в будущем,ну в смысле когда/если это понадобится ?

PainKiller 22.04.2014 17:43

Странный подход, хотя может мы друг друга не правильно поняли.
Допустим у нас есть такой сеттер и геттер:
Код AS3:

private var _some:int;
 
public function set some(value:int):void
{
  _some = value;
}
 
public function get some():int
{
  return _some;
}

Этот код можно заменить одной публичной переменной:
Код AS3:

public var some:int

и никакой разницы кроме как в скорости, и количестве кода не будет. Так вот я и имел виду, что сеттеры и геттеры имеет смысл писать только если в них делаются еще какие либо действия кроме присвоения/отдачи значения. Во всех остальных случаях плодить сетеры/гетеры - пустышки - это ненужный фанатизм.

ZackMercury 22.04.2014 17:46

Я вообще не понимаю, зачем нужен public var. За несколько тысяч написанных мною строк кода ни разу не понадобилось использовать public var.
Например, был класс, общавшийся с сервером. Он загружал данные с него, записывал в приватную переменную _data, и посылал событие окончания загрузки.
Я решил, что снаружи устанавливать значение _data ну вообще никуда не пригодится, и сделал get-метод для получения данных после загрузки. Более того, в нём я проверил, есть ли что в переменной и добавил дополнительные действия.

Приведите же хоть один пример, когда открытые переменные ну уж очень необходимы.

caseyryan 22.04.2014 17:49

Цитата:

Во всех остальных случаях плодить сетеры/гетеры - пустышки - это ненужный фанатизм.
Я лично чаще всего пишу код так, что в геттерах сеттерах есть дополнительный код. Например отправка события, сообщающего о том, что свойство изменилось.
Но на счет голых геттеров сеттеров, спорить бессмысленно. Потому что аргументов в их защиту просто не найти (кроме банального преследования "правильности" подхода)
Цитата:

Приведите же хоть один пример, когда открытые переменные ну уж очень необходимы.
Их масса. Просто у тебя еще опыта мало.

ZackMercury 22.04.2014 17:59

Цитата:

Их масса.
Классный пример)

caseyryan 22.04.2014 18:06

Хочешь более реальный пример: приходит с сервера сообщение через сокет. И происходит это с десяток-другой раз в секунду. Надо эти данные записать в переменные и передать куда-то дальше. Вот тут как раз идеальный вариант писать в паблик вар. Это будет гораздо быстрее. ГОРАЗДО! Вот в этом случае как раз производительность имеет заначение. Плюс, имея там типизированные переменные, не тратится время на дополнительное пиведение типов

in4core 22.04.2014 19:08

caseyryan гораздо быстрее по сравннию с чем? С целероном 88 годов ? Пример то понятен - но в скорости тут выигрыша никакого нет, по крайней мере визуального - а оно нам главное во флеше. Разговор о скорости начинает идти, когда задержка на выполнение скрипта становится хотя бы 0.05 - в других случаях о какой скорости идет речь... скорости ума если тока.

Akopalipsis 22.04.2014 19:42

Посли таких слов вспоминается Ваша тема про "всё-всё лагает":)

caseyryan 22.04.2014 20:58

Цитата:

Сообщение от in4core (Сообщение 1164277)
caseyryan гораздо быстрее по сравннию с чем? С целероном 88 годов ? Пример то понятен - но в скорости тут выигрыша никакого нет, по крайней мере визуального - а оно нам главное во флеше. Разговор о скорости начинает идти, когда задержка на выполнение скрипта становится хотя бы 0.05 - в других случаях о какой скорости идет речь... скорости ума если тока.

Это как раз тот случай, когда через геттеры и сеттеры начнет лагать. Я это не из воздуха взял. На войне икс наступал на эти грабли. Там сообщения перли сотнями в секунду, и когда сделал через методы сет/гет, в этом месте начинало тормозить. Долго пытался хоть как-то улучшить производительность, и решением как раз было именно это (а каких мучений стоило к этому прийти). Хоть кому-то и с трудом в этом поверится.


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

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