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

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

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

Регистрация: Jan 2004
Адрес: Украина, Харьков
Сообщений: 1,524
Отправить сообщение для __i с помощью ICQ
По умолчанию Дурное влияние Bindable на геттеры и сеттеры

И так начнем наш рассказ

Жили были два класса:
Класс В (в потому что биндабл)
Код:
package
{
	import flash.events.IEventDispatcher;
	import flash.events.EventDispatcher;
	[Bindable]
	public class ItemVOB
	{
		private var  _label 	: String;
		
		public function set label( value:String ) : void
		{
			trace("I'm setter B");
			_label = value;
		} 
		
		public function get label( ) : String
		{
			return _label;
		}
	}
}
и класс А (потому что мне так захотелось)
Код:
package
{
	import flash.events.IEventDispatcher;
	import flash.events.EventDispatcher;

	public class ItemVOA
	{
		private var  _label 	: String;
		
		public function set label( value:String ) : void
		{
			trace("I'm setter A");
			_label = value;
		} 
		
		public function get label( ) : String
		{
			return _label;
		}
	}
}
И отличались они только одним словом. Все бы ничего, жили бы они долго и счастливо есть бы не решил я сделать такой ход конем
Код:
var ia : ItemVOA = new ItemVOA();

ia.label = 'hod konem';
....
ia.label = 'hod konem';

var ib : ItemVOB = new ItemVOB();

ib.label = 'hod konem';
....
ib.label = 'hod konem';
И тут госпада делаем ставки какой результат работы вы увидите?
Код:
I'm setter A
I'm setter A
I'm setter B
I'm setter B
а вот вам и болт результат будет
Код:
I'm setter A
I'm setter A
I'm setter B
теперь приблизительное объясние болта (вероятно не вразумительное и может содержать кучу арфагарфических и лагических ошибок )

Мета тег [Bindable] говорит компилятору что он должен создать обертку для свойства указаного под биндабл (если смотреть в дебагере то в классе с такой переменной коявляються такие интересные приватные сеттеры типа _13234234label, которые туда не клали). Эта обертка является тем же геттером/сеттером которая при получении какого либо значения диспатчит событие об изменении данных, ну и заодно в эту обертку вставили проверку на изменение данных, т.е. в приведенном случае 'hod konem' == 'hod konem' - фактически данные не изменились, поээтому, реальный сеттер просто не вызывается!


Применение на практике :

Данная фича свободно позволяет девелоперу почувствовать себя полным дауном, идиотом, потерять веру в компилятор, в дебагер, в жизнь, а также занимательно потратить много времени.

Следите за кодом и ходом вышей мысли, будте счастливы!
__________________
33 коровы

Старый 09.09.2007, 15:59
Entropy вне форума Посмотреть профиль Отправить личное сообщение для Entropy Посетить домашнюю страницу Entropy Найти все сообщения от Entropy
  № 2  
Ответить с цитированием
Entropy

Регистрация: May 2001
Адрес: Мосва
Сообщений: 34
Отправить сообщение для Entropy с помощью ICQ
...и RTFM перед программингом.

Цитата:
The Flex compiler automatically generates an event named propertyChange for the property. If the property value remains the same on a write, Flex does not dispatch the event or update the property. To determine if the property value changes, Flex calls the getter method to obtain the current value of the property.

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

Регистрация: Jan 2004
Адрес: Украина, Харьков
Сообщений: 1,524
Отправить сообщение для __i с помощью ICQ
Цитата:
Сообщение от Entropy
...и RTFM перед программингом.
ты каждый день перечитываешь о том, что земля круглая?

во вторых твоя цитата не из той оперы , но рядом, почти попал )
__________________
33 коровы

Старый 09.09.2007, 16:04
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 4  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Собственно, а зачем обновлять значение, если старое совпадает с текущим?
В сеттерах лучше всегда писать так:

Код:
private var _property:uint;

public function set property(value:uint):void {
    if (value == this._property) {
        return;
    }

    bla-bla-bla
}

Старый 10.09.2007, 00:40
miramax вне форума Посмотреть профиль Отправить личное сообщение для miramax Посетить домашнюю страницу miramax Найти все сообщения от miramax
  № 5  
Ответить с цитированием
miramax
 
Аватар для miramax

Регистрация: Oct 2005
Адрес: Борисоглебск
Сообщений: 1,702
Отправить сообщение для miramax с помощью ICQ Отправить сообщение для miramax с помощью AIM Отправить сообщение для miramax с помощью MSN Отправить сообщение для miramax с помощью Yahoo Отправить сообщение для miramax с помощью Skype™
Цитата:
Сообщение от __etc
Собственно, а зачем обновлять значение, если старое совпадает с текущим?
Если в сеттер передаётся примитив, то незачем.
А если я не юзал коллекций, и у меня из старого кода передаётся массив?
А в сеттере ведётся перебор и апдейт элементов.
То сеттер не будет вызван, т.к. предыдущий массив прежний объект, хоть и с иной структурой.
__________________
AS3 | www.FLAPS.ru | Русские флэшеры самые умные флэшеры в мире. ©

Старый 10.09.2007, 03:02
lowka вне форума Посмотреть профиль Отправить личное сообщение для lowka Найти все сообщения от lowka
  № 6  
Ответить с цитированием
lowka

Регистрация: Sep 2006
Сообщений: 256
Цитата:
Сообщение от miramax
Если в сеттер передаётся примитив, то незачем.
А когда оказывается, что одно и тоже значение может на многое повлиять, то мы каждый раз обнуляем примитив перед очередным обновлением

Старый 19.09.2007, 09:41
Entropy вне форума Посмотреть профиль Отправить личное сообщение для Entropy Посетить домашнюю страницу Entropy Найти все сообщения от Entropy
  № 7  
Ответить с цитированием
Entropy

Регистрация: May 2001
Адрес: Мосва
Сообщений: 34
Отправить сообщение для Entropy с помощью ICQ
Цитата:
Сообщение от miramax
Если в сеттер передаётся примитив, то незачем.
А если я не юзал коллекций, и у меня из старого кода передаётся массив?
А в сеттере ведётся перебор и апдейт элементов.
То сеттер не будет вызван, т.к. предыдущий массив прежний объект, хоть и с иной структурой.
Да, и это правильно, ибо data binding, по сути, шаблон Observer, где есть наблюдаемый объект и наблюдатель. Массив - наблюдаемый объект, и раз он не посылает сообщений наблюателю, то как последний узнает, что массив был изменен? А если массив содержит сложные объекты, свойства которых меняются, как узнать, что свойство элемента массива изменено? Есть только два способа - либо постоянно перебирать всю коллекцию и сравнивать ее состояние с неким ранее запомненым состоянием. Этот способ - шаблон Unit of work - в данном случае не применим из-за низкой производительности, либо самостоятельно посылать сообщения наблюдателю.

Атрибут Bindable - для тех лентяев, кто не хочет сам возиться с диспетчем сообщений - он это делает за вас. И механизм этого хорошо описан в документации, так что никаких проблем не вижу, все правильно сделано.

Старый 10.09.2007, 02:15
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 8  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Надо просто поставить тест. Хотя не думаю, что оно не будет работать для непримитивов.

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

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

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


 


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


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