Closures vs Delegates  XML
Índice dos Fóruns » Assuntos gerais (Off-topic)
Autor Mensagem
Link_pg
JavaEvangelist
[Avatar]

Membro desde: 28/04/2006 00:17:38
Mensagens: 413
Localização: Praia Grande / São Paulo - SP
Offline

Olá!

Pessoal, alguém poderia me explanar algo sobre a diferença do conceito de Closures pros Delegates (.NET, Javascript)?

Abraços

Eduardo Felipe Vieira

Blog de Tecnologia!
Outro blog meu legal também mas não é de TI.



"Nós poderíamos ser muito melhores se não quiséssemos ser tão bons."
[Email] [WWW] [MSN]
juliofsn
JavaEvangelist
[Avatar]

Membro desde: 21/11/2006 20:48:46
Mensagens: 311
Offline

Bom, pra mim Closures é a capacidade de se declarar funções dentro de outras, enquanto Delegates são mais parecidos com os ponteiros de funções do C.

O que acontece é que apesar de funcionar de formas diferentes, ambos servem para quando você quer passar uma função como argumento para outra. Então, nesse caso, acabam sendo utilizados da mesma forma.

Acho que é isso.

Que a Força esteja com Você!
enantiomero
JavaEvangelist

Membro desde: 23/04/2008 09:44:26
Mensagens: 304
Offline

Uma closure captura o contexto onde foi usada.
Um delegate normalmente é um método declarado no mesmo nível dos outros métodos e somente captura o objeto referente à classe onde foi declarado.
Por exemplo, digamos que houvesse closures em Java.

Você poderia usar algo como:



Mas se houvesse delegates em Java, você não poderia usar o valor de ascending. Você teria algo como:

onde você passa só o nome do método, não um objeto contendo o tal método.

This message was edited 1 time. Last update was at 16/09/2009 11:21:57

Link_pg
JavaEvangelist
[Avatar]

Membro desde: 28/04/2006 00:17:38
Mensagens: 413
Localização: Praia Grande / São Paulo - SP
Offline

Está quaaaaaaaase claro após essas explicações, só preciso refletir mais um pouco ahueuaehaeu.

Valeu!

Eduardo Felipe Vieira

Blog de Tecnologia!
Outro blog meu legal também mas não é de TI.



"Nós poderíamos ser muito melhores se não quiséssemos ser tão bons."
[Email] [WWW] [MSN]
Link_pg
JavaEvangelist
[Avatar]

Membro desde: 28/04/2006 00:17:38
Mensagens: 413
Localização: Praia Grande / São Paulo - SP
Offline

Então pelo que percebi, uma closure tem livre acesso ao escopo em que está inserida, certo? Diferente de classes anônimas... o mesmo exemplo com classes anônimas:



Não tenho certeza se o compare de Sorteable anonimo consegue mesmo acessar o ascending la em cima. Se consegue, porque tem que ser final? (Essa é outra das minhas dúvidas de sempre que nunca lembrava de perguntar aheuhaeuh).

Eduardo Felipe Vieira

Blog de Tecnologia!
Outro blog meu legal também mas não é de TI.



"Nós poderíamos ser muito melhores se não quiséssemos ser tão bons."
[Email] [WWW] [MSN]
Bruno Laturner
GUJ Expert
[Avatar]

Membro desde: 18/02/2008 16:17:53
Mensagens: 3002
Offline

Link_pg wrote:
Não tenho certeza se o compare de Sorteable anonimo consegue mesmo acessar o ascending la em cima. Se consegue, porque tem que ser final? (Essa é outra das minhas dúvidas de sempre que nunca lembrava de perguntar aheuhaeuh).


Consegue, mas só se for final. Agora, sobre o por quê, senta que lá vem história:

http://mindprod.com/jgloss/anonymousclasses.html
http://techtracer.com/2008/04/14/mystery-of-accessibility-in-local-inner-classes/
http://bugs.sun.com/view_bug.do?bug_id=4351453

A resposta acima foi achada em menos de 5 minutos no google.
The prisoner falls in love with his chains. --E.W. Dijkstra
[WWW]
tnaires
GUJ Master
[Avatar]

Membro desde: 22/12/2003 08:05:58
Mensagens: 1678
Localização: Porto Alegre/RS - Natal/RN
Offline

enantiomero wrote:Uma closure captura o contexto onde foi usada.

É isso aí. Para que uma função seja uma closure, são necessários três requisitos:

1) A função deve ser um objeto de primeira classe. Isso significa dizer que ela pode ser manipulada sem restrições, em comparação com outras estruturas da própria linguagem. Em Java, você pode passar objetos como parâmetro para métodos, e objetos também podem ser retornados por métodos. Mas o mesmo não pode ser feito com os próprios métodos.

2) A função deve poder referenciar variáveis livres. Qualquer variável referenciada pela função que não seja local - incluindo os parâmetros - é uma variável livre. No exemplo do enantiomero, a variável ascending é livre. Se ela não puder ser acessada pela função, então essa função não pode ser considerada closure.

3) Os valores das variáveis livres que a função usa devem ser determinados de acordo com o contexto, como falou o enantiomero. Se o método sort for executado duas vezes, e em cada uma das vezes a variável livre ascending possuir valor diferente, ele deve ser sensível a essa mudança.

Tarso Nunes Aires

Blog - http://cabritin.wordpress.com/
Delicious - http://delicious.com/tnaires
Twitter - @tnaires

 
Índice dos Fóruns » Assuntos gerais (Off-topic)
Ir para:   
Powered by JForum 2.1.8 © JForum Team