![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Добрый день,
существует Object (к примеру) такого вида: var dataset:Object = {
one: "1",
two: "2",
sub: {
bool: true,
dataset: {
value_to_check: "someValue"
}
}
};
К примеру: ...такой способ страшно долгий и на мой взгляд не практичный, можно ли данное выражение лексически описать максимально короче (имеется в виду - as3 кодом)? |
|
|||||
|
Спасибо.
|
|
|||||
public function getProperty(obj: Object, property: String):* { if (obj != null && property != null && property != '') { var value: *; var prop : String; var props: Array = property.split('[').join('.').split(']').join('.').split('.'); while (props.length > 0) { prop = props.shift(); if (obj && prop && prop in obj) { value = obj[prop]; obj = value; } } return value; } return null; } var value:Object = getProperty(dataset, 'dataset.sub.dataset.value_to_check'); А вообще нетипизированный доступ - это очень и очень плохо!
__________________
http://www.chessmax.ru |
|
|||||
|
Для проверки существования нужно использовать оператор in.
Вообще через try можно, но не люблю я такие штуки. Можно написать свой метод getValue, в который передавать строковую переменную. - в примере "dataset.sub.dataset.value_to_check". Меня как всегда опередили =(
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
|
try/catch тормозит, так что зря-понапрасну лучше не использовать
__________________
http://www.chessmax.ru |
|
|||||
|
Ты не прав, бро.
var hash:Object = { obj: { obj: { value: 5 } } }; trace(hash.obj.obj.value); var i:int; var count:int = 1000000; var value:int; var startTime:int; startTime = getTimer(); i = count; while (i--) { try { value = hash.obj.obj.value; } catch (error:Error) { } } trace("Hit try: ", (getTimer() - startTime)); startTime = getTimer(); i = count; while (i--) { try { value = hash.obj.noObject.value; } catch (error:Error) { } } trace("Miss try: ", (getTimer() - startTime)); startTime = getTimer(); i = count; while (i--) { value = getProperty(hash, "obj.obj.value"); } trace("Hit getProperty: ", (getTimer() - startTime)); startTime = getTimer(); i = count; while (i--) { value = getProperty(hash, "obj.noObject.value"); } trace("Miss getProperty: ", (getTimer() - startTime));
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
|
Говоря о "тормознутости" try/catch я имел ввиду общий случай, а не этот конкретно. Результаты теста у меня идентичны Вашим, но опять таки, немного наигран тест, если чуток его изменить, то try/catch нервно курит в сторонке((
var hash:Object = { obj: { obj: { value: 5 } } }; trace(hash.obj.obj.value); var i:int; var count:int = 1000000; var value:int; var startTime:int; startTime = getTimer(); i = count; while (i--) { try { value = hash.obj.obj.value; } catch (error:Error) { } } trace("Hit try: ", (getTimer() - startTime)); startTime = getTimer(); i = count; while (i--) { try { value = hash.obj.obj.value.prop; } catch (error:Error) { } } trace("Miss try: ", (getTimer() - startTime)); startTime = getTimer(); i = count; while (i--) { value = getProperty(hash, "obj.obj.value"); } trace("Hit getProperty: ", (getTimer() - startTime)); startTime = getTimer(); i = count; while (i--) { value = getProperty(hash, "obj.obj.value.prop"); } trace("Miss getProperty: ", (getTimer() - startTime)); Miss try: 13299 Hit getProperty: 8104 Miss getProperty: 8987 А у Вас такие же результаты? Или я что-то не так делаю? Да, получается, что метод то себя не оправдал, а жаль((
__________________
http://www.chessmax.ru |
|
|||||
|
Нельзя говорить о "нервно курит в сторонке", пока один из параметров (который, кстати, должен доминировать: чаще отсутствие поля это исключительный случай, а не наоборот) работает в 40 раз быстрее =)
try/catch мне не нравится тем, что в строчке кода, которую я в него оберну, может содержаться совершенно другое RTE. Я стараюсь не использовать его вообще нигде. Поэтому идеологически твой вариант мне ближе, но я бы реализовал его по другому: getProperty возвращает Boolean, удалось считать ли, а сам getProperty записывает в поле считанное значение. Т.е. Проблема с двойственностью толкования null исчезнет и исчезнет геморрой по повторному вбиванию длинного пути до хэша (первый раз для проверки, второй раз для присваивания).
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
|
А если так:
var hash:Object = { obj: { obj: { value: 5 } } }; trace(hash.obj.obj.value); var i:int; var count:int = 1000000; var value:int; var startTime:int; var props: Array; startTime = getTimer(); i = count; while (i--) { try { value = hash.obj.obj.value; } catch (error:Error) { } } trace("Hit try: ", (getTimer() - startTime)); startTime = getTimer(); i = count; while (i--) { try { value = hash.obj.obj.value.prop; } catch (error:Error) { } } trace("Miss try: ", (getTimer() - startTime)); startTime = getTimer(); i = count; props = ('obj.obj.value').split('[').join('.').split(']').join('.').split('.'); while (i--) { value = getProperty(hash, "obj.obj.value", props); } trace("Hit getProperty: ", (getTimer() - startTime)); startTime = getTimer(); i = count; props = ('obj.obj.value.prop').split('[').join('.').split(']').join('.').split('.'); while (i--) { value = getProperty(this, "obj.obj.value.prop", props); } trace("Miss getProperty: ", (getTimer() - startTime)); Hit try: 234 Miss try: 13595 Hit getProperty: 627 Miss getProperty: 695 В общем производительность оценить в AS3 на глаз (и даже такими синтетическими тестами) нереально, слишком много факторов не учитывается. Я возможно заменю "внутренности" getProperty на try/catch. Пока в раздумьях, просто я придерживаюсь мнения, что там где можно обойтись без ловли ошибок, нужно обходится... Добавлено через 2 минуты Цитата:
Добавлено через 3 минуты Цитата:
Добавлено через 4 минуты Такая запись затрудняет чтение. А вот так ли часто нужно знать если свойство, если его значение null? Добавлено через 5 минут Ну в общем я за производительность обеями ногами, как говорится копейка Гигагерц бережет)
__________________
http://www.chessmax.ru |
![]() |
![]() |
Часовой пояс GMT +4, время: 14:21. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|