Página inicial do Grupos do Google
Ajuda | Acessar
Mensagem sobre o tópico Qual a sacada do Bindable?
O grupo no qual você está postando é um grupo da Usenet. As mensagens postadas neste grupo farão com que o seu e-mail fique visível para qualquer pessoa na Internet
Sua resposta não foi enviada.
Post publicado
Beck Novaes  
Ver perfil
 Mais opções 27 nov 2007, 15:11
De: Beck Novaes <beck.nov...@gmail.com>
Data: Tue, 27 Nov 2007 09:11:22 -0800 (PST)
Local: Ter 27 nov 2007 15:11
Assunto: Re: Qual a sacada do Bindable?
######################################################
# Ministério da Saúde Adverte: Este post será bem maior do que o
# convencional e esta explicação sobre o funcionamento viciante
# do Data Binding pode fazer o seu cérebro entrar em loop.
######################################################

O [Bindable] é uma Metadata Tag o que significa dizer que é uma
instrução para o compilador fazer alguma coisa. Neste caso você está
falando para o compilador gerar o código necessário para sua
propriedade ser a fonte do DataBinding.

O segredo do funcionamento do DataBinding está na classe
"mx.binding.utils.ChangeWatcher". Esta classe se baseia em listeners
para fazer a "mágica" do DataBinding.

Tomemos o seguinte trecho de código abaixo para facilitar a
explicação:
<mx:TextInput id="tiSource"/>
<mx:TextInput id="tiDestination" text="{tiSource.text}"/>

Neste exemplo, toda vez que o usuário digitar algo no TextInput
"tiSource" isto será automaticamente copiado para o TextInput
"tiDestination".

Isto é possível porque a propriedade "text" é Bindable. Como tal, toda
vez que esta propriedade mudar ela distribuirá um evento - que neste
caso é chamado de "textChanged". Graças ao ChangeWatcher, que é usado
implicitamente toda vez que usamos as chaves {} para determinar o
Binding, será criado automaticamente um EventHandler para tratar este
evento "textChanged". A implementação deste EventHandler pegará o
valor do "text" de "tiSource" e copiará para o "text" de
"tiDestination".

Em outras palavras, a mágica do DataBinding é um código que é gerado
automaticamente pelo compilador do Flex que se baseia na arquitetura
Listener - Handler que já conhecemos: alguém distribui um evento e
alguém ouve para fazer alguma coisa. Neste caso uma propriedade muda,
e um código gerado automaticamente através de uma sintaxe predefinida
(chaves{}) copia o valor desta propriedade para outra.

Eu fiz um teste no Flex usando a opção keep-generated-
actionscript=true  com uma propriedade Bindable e o resultado segue
abaixo.

Test.mxml
========

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
    width="100%" height="100%">
        <mx:Script>
                <![CDATA[
                        [Bindable]
                        private var myProp:String;
                ]]>
        </mx:Script>
</mx:Application>

_Test-binding-generated.as (Código gerado pelo compilador Flex)
======================================================
class BindableProperty
{

    [Bindable(event="propertyChange")]
    private function get myProp():String
    {
        return this._1060147409myProp;
    }

    private function set myProp(value:String):void
    {
        var oldValue:Object = this._1060147409myProp;
        if (oldValue !== value)
        {
                        this._1060147409myProp = value;

dispatchEvent(mx.events.PropertyChangeEvent.createUpdateEvent(this,
"myProp", oldValue, value));
        }
    }

}

Ou seja, o usar o [Bindable] o compilador Flex gerou o arquivo "_Test-
binding-generated.as" cujo conteúdo pode ser visto acima. Observe que
no "set" da propriedade um evento é disparado. No MXML acima se a
propriedade "myProp " não fosse Bindable este código não seria gerado.
Mas isso é só uma parte do funcionamento do Bindable. Ainda é preciso
definir o que irá acontecer toda vez que o "myProp" mudar.

Primeiramente apenas definimos a propriedade como Bindable. Agora
vamos usá-la.

Test.mxml
========

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
    width="100%" height="100%">
        <mx:Script>
                <![CDATA[
                        [Bindable]
                        private var myProp:String;
                ]]>
        </mx:Script>
        <mx:TextInput id="myTextInput" text="{myProp}"/> <!-- USANDO O
BINDING -->
</mx:Application>

Agora, outro trecho de código gerado pelo Flex, desta vez no arquivo
"Test-generated.as" é o seguinte:

Test-generated.as
===============

private function _Test_bindingsSetup():void
{
...
binding = new mx.binding.Binding(this,
            function():String
            {
                var result:* = (myProp);
                var stringResult:String = (result == undefined ?
null : String(result));
                return stringResult;
            },
            function(_sourceFunctionReturnValue:String):void
            {

                myTextInput.text = _sourceFunctionReturnValue;
            },
            "myTextInput.text");
...

}

Quem quiser entender o que faz cada linha do trecho de código acima
pode olhar no código fonte da classe mx.binding. Binding. Mas em
resumo, é este trecho de código que pega o valor de "myProp" toda vez
que ele mudar e copia para "myTextInput.text".

Por fim, eu gostaria de sintetizar o que o Daniel e o Erko.

Erko (Tese):
"então a dica é: use [bindable] para o que for realmente necessário "

Daniel (Antítese):
"Use bindable para tudo. Acredito ser muito dificil ele prejudicar a
performance de forma a ser perceptíviel"

Beck (Síntese):
Você pode sim usar o Bindable despreocupadamente do ponto de vista da
performance, mas em alguns casos o Bindable reduz a legibilidade do
seu código, o que dificulta na manutenção. Além disso por usar Event
Listeners, o Bindable cria dependências entre os objetos o que impede
que eles sejam excluídos da memória pelo Garbage Collection.

Será que alguém entedeu alguma coisa? Será que alguém leu tudo
isso? :-)

[]'s
Beck Novaes

On 23 nov, 14:20, Daniel Schmitz <daniel...@gmail.com> wrote:

> "então a dica é: use [bindable] para o que for realmente necessário "

> Use bindable para tudo. Acredito ser muito dificil ele prejudicar a
> performance de forma a ser perceptíviel

> Outra coisa, o bindable ajuda a manter o seu código mais limpo e com
> mens bugs. Só isso já compensa o 100 milisegundos perdidos por causa
> do bindable.

> Agora, não culpe o bindable lento se seu grid tem 10.000 registros :)
> Ae ninguem aguenta :)

> Abraços,
>  Daniel Schmitz

> On 23 nov, 11:45, "Erko Bridee de Almeida Cabrera"

> <erko.bri...@gmail.com> wrote:
> > Marcelo quanto a sua pergunta:

> > campos bindable tendem a diminuir a performace do sistema???

> > do ponto de vista gasto computacional (aumento do consumo de processamento)
> > a resposta seria SIM, mas isso depende muito de como vc vai usar

> > este recurso é amplamente utilizado em aplicações flex

> > é como se você tivesse um método set para este atributo que nele
> > vc alem de atualizar o valor do atributo, sai percorrendo toda tua aplicação
> > vendo onde que este está relacionado a campos e outros compontes
> > atualizando os mesmo

> > então a dica é: use [bindable] para o que for realmente necessário

> > []´s

> > Em 23/11/07, Thiago Rodrigues Fernandes <thifernan...@gmail.com> escreveu:

> > > Eu nunca senti diferença usando bindable ou não...

> > > Não sei no caso de muitos registros.

> > > --
> > > Att,
> > > Thiago R. Fernandes

> > > On Nov 23, 2007 11:16 AM, Marcelo Moacir Florindo <
> > > marceloflori...@gmail.com> wrote:

> > > > campos bindable tendem a diminuir a performace do sistema???

> > > > Marcelo

> > > > Em 23/11/07, Erko Bridee de Almeida Cabrera < erko.bri...@gmail.com>
> > > > escreveu:

> > > > > Ele indica para oq tu define como bindable que seja observado...

> > > > > por exemplo vc tem um atributo e marca ele como observado [bindable]

> > > > > e este vc relaciona a um campo....

> > > > > quando você mudar o valor desse campo ele irá automaticamente
> > > > > atualizar
> > > > > o campo que está relacionado com este atributo...

> > > > > caso tu não utilize o bindable, a atualização do campo não ocorreria
> > > > > quando você alterar o valor do atributo...

> > > > > []´s
> > > > > --
> > > > > Att,
> > > > > Erko Bridee de Almeida Cabrera
> > > > >http://erkobridee.com/
> > > > >http://www.portaljava.com

> > > > --
> > > > Marcelo Moacir Florindo
> > > > Analista/Desenvolvedor
> > > >http://www.gestaotec.com.br

> > --
> > Att,
> > Erko Bridee de Almeida Cabrerahttp://erkobridee.com/http://www.portaljava.com


    Responder ao autor    Encaminhar  
É necessário Efetuar login antes de postar mensagens.
Para postar uma mensagem você precisa primeiro participar deste grupo.
Atualize seu apelido na página de configurações da inscrição antes de postar.
Você não tem a permissão necessária para postar.

Criar um grupo - Grupos do Google - Página inicial do Google - Termos de Uso - Política de Privacidade
©2008 Google