Delegados de execução

Problema

  

Você quer usar uma arquitetura de delegado para racionalizar como funciona o seu código e evitar conflitos de código. Teoria Ao escrever JavaScript, muito frequentemente código irá lutar pela atenção. Um exemplo de código disputam a atenção é o evento window.onload. O evento window.onload é chamado uma vez a página HTML foi completamente carregado e inicializado. Quando o navegador solicita window.onload, o navegador está dando a chance de um script para inicializar-se com uma página HTML completa. Para scripters, este método é muito interessante, e se há dois conjuntos de ferramentas usando window.onload, mais provável que não irá substituir um ao outro. Imagine o seguinte código escrito por um conjunto de ferramentas: window.onload = function () (/ / initialize toolkit 1) Nesse exemplo o código do kit de ferramentas está dizendo que quando o evento onload é chamado, usar a minha função. O kit de ferramentas segundo interessados no evento onload seria atribuir window.onload para o seguinte: window.onload = function () (/ / initialize Toolkit 2) A atribuição segundo iria funcionar, mas levanta a questão, o que acontece com a inicialização do toolkit 1? A resposta é que não é chamado. Toolkits 1 e 2 estão lutando pela atenção do evento onload, eo vencedor é qualquer toolkit atribui o evento onload passado. Existem três soluções possíveis para este dilema:

• Converter os kits de ferramentas para uso do navegador tags específicas que lhes permitam referência onload funções múltiplas. A desvantagem desta solução é que você precisa escrever no navegador de código específico, o que aumenta o custo de manutenção do código.

• Use uma função que chama tanto inicializações. A desvantagem é que você precisa fornecer uma função que gere tanto inicializações.

• Converter os kits de ferramentas para jogar bem com os outros e não substituir a inicialização do outro. A desvantagem é que os kits de ferramentas têm de descobrir como chamar as rotinas de inicialização outros. Solução Conforme mencionado, a desvantagem da primeira solução apresentada na seção anterior é que é navegador específico. Para o Mozilla, a solução é bastante elegante, pois ele implementa uma arquitetura delegado. Para outros navegadores, a primeira solução não é tão elegante, e, portanto, a solução final é uma mistura das soluções de segunda e terceira. No momento, porém, vamos nos concentrar na segunda solução, que é implementado como se segue:

window.onload = function () (initializeToolkit1 (); initializeToolkit2 ();)

A função windows.onload é atribuída uma função que chama as rotinas de inicialização de kits 1 e 2. A solução funciona, mas tem problemas de manutenção, uma vez que um desenvolvedor tem que adicionar ou remover rotinas de inicialização. Este não é um problema grave, porém. Se você olhar para a execução da função, é a conversão de uma chamada de função em duas chamadas de função. Esta é a base de um delegado.

As funções initializeToolkit1 e initializeToolkit2 nada têm a ver com o outro, e quando são chamados, cada um poderia ser facilmente enganado em pensar que ela é a única função atribuída ao evento onload. Um delegado não é como um proxy, em que um delegado todas as chamadas funções, enquanto que um proxy irá chamar uma função de primeiro e depois esperar o chamado função para chamar as outras funções. De uma perspectiva de implementação, um delegado tem uma aplicação muito similar a um proxy. A execução de JavaScript de um delegado não difere de um delegado tradicional porque não existe uma única instância do objeto de gestão de todas as referências. Em uma implementação clássica delegado, chamando a função window.onload irá chamar uma estrutura objeto delegado, que chama as referências função gerenciada. No caso do exemplo, o que significa chamar a estrutura do objeto delegado chama initializeToolkit1 e initializeToolkit2. Delegado Na execução de JavaScript, referências window.onload uma função de representante pai que contém duas referências função: func1 e func2. A função de delegado pai chama tanto func1 e func2. Ao delegar as funções dos pais são encadeados, func1 (escolhido para fins de ilustração) faz referência a uma função para chamar (initializeToolkit1), e func2 (de novo escolhido para fins de ilustração) referências a delegação do pai ao lado da cadeia. Na delegação do pai ao lado, uma função de referências a função de chamada (initializeFunction2), e as referências de outra função outra função delegada do pai. Para entender o problema de serialização, imagine tentar serializar window.onload referências usando:

window.onload = function () (delegates.invoke (this, arguments);) var buffer = ops.serialize (window.onload);

No exemplo, as referências window.onload uma função que chama o método delegates.invoke variável global, que irá chamar a initializeToolkit1 funções e initializeToolkit2. Se queremos salvar o estado da página HTML, vamos serializar window.onload porque é um ponto de referência padrão. No entanto, window.onload serialização não serializar delegados. Ele serializa a referência aos delegados, e, portanto, quando a página é recriada, a instância de delegados será ausente. Você pode ler o parágrafo anterior e acho que perdi meu bolinhas, porque não é assim que a serialização é feito. Você pode implementar a solução em vez disso:

window.unload = function () (var buffer = ops.serialize (delegados);) `

Nesta solução, a descarregar função será chamada, e um fluxo de dados que representa os delegados serão gerados. Mas essa solução é realmente correta? Defendo que a solução é delegar o problema dos delegados variável para outro local, e não é nada de resolver. Imagine, por exemplo, que você é serializar o estado de uma página. Como você iterar os elementos, você está gerando as funções associadas. Então você vai serializar window.load e window.unload. A grande vantagem dessa abordagem é que quando a codificação usando um protótipo baseado em linguagem JavaScript, que você não está preocupado com múltiplas implementações partilha as mesmas referências. Utilizando uma abordagem baseada em valor, você pode copiar uma função de um objeto a outro e não se preocupar com o problema descrito no artigo mixin 2-15. Agora que você está familiarizado com a teoria por trás da implementação delegado, vamos olhar para os detalhes técnicos .

 Fonte: / website / root / scripts / Jaxson delegado Common.js: function (exemplo, funcIdentifier, newFunc) (var delegatePrototype = function () (var func1 = __replace1; var func2 = __replace2; func1.apply (this, arguments); func2 . apply (this, arguments);) origFunc var if (exemplo! [funcIdentifier]) (origFunc = function () ();) else (origFunc instância = [funcIdentifier];) [instancia funcIdentifier] = Generics.expand (delegatePrototype , (__replace1: origFunc, __replace2: newFunc));) Fonte: / website / ROOT / artigos ajax / javascript / exceptions.html window.onload = function () (window.onerror = function (msg, arquivo, localização) (info ( "window.onerror1", "Msg (" msg + + " ) (arquivo "+ arquivo +") local ( "+ + location ")"); ops.delegate)) (window," onload ", function () (window.onerror = function (msg, arquivo, localização) (info ( "window.onerror2", "Msg (" msg + + ") arquivo (" + arquivo + ") local (" + + location ")");)));

No exemplo, a função window.onload é atribuída uma função. A próxima linha do código-fonte usa a chamada de método ops.delegate para converter a função atribuída a um delegado. Assim, quando o evento window.onload é chamado, as duas funções são chamados, tanto dos que atribuem window.onerror. Uma conseqüência utilizando os delegados é que um programador pode usar delegados, mas esquecem-se os recursos de que atribuir usando delegados são compartilhadas também. Portanto, um bom programador não irá atribuir window.onerror, mas irá utilizar um delegado para atribuir window.onerror. Ao escrever código em um método ou chamada de função deve ser compartilhado, você pode usar os delegados, mas manter os seguintes pontos em mente :

• Delegados permitir que os programadores de compartilhar um método callback, mas não devem assumir que os recursos em sua aplicação método são exclusivos.

• Delegados resolver o problema em uma única chamada de método pode ser usado para fazer chamadas de método múltiplo.

• Os delegados não podem retornar valores, porque vários métodos podem retornar valores, assim, os delegados devem sempre usar blocos de código. Blocos de código são inerentemente únicos, múltiplos, ou não orientadas para os resultados. Usando blocos de código não exige que a infra-estrutura para fazer nada de especial, quando os dados tem que ser devolvido.

• Os delegados podem ser implementadas usando referência ou duck typing valor, com a principal diferença entre eles é a capacidade de serializar.

um artigo submetido por Sonja Lande


Isenção de responsabilidade:O nosso site não se responsabiliza pelo conteúdo deste artigo. Webarticles é uma fonte de informação livre.
Importante: Este artigo "Aplicação de Delegados" foi traduzida por um software automático. Nós sentimos muito por quaisquer erros de ortografia que pode ter ocorrido. Obrigado pela sua compreensão.


Online: 187 users browsing the articles directory   


  

|