BT
x A sua opinião é importante! Por favor preencha a pesquisa do InfoQ sobre os seus hábitos de leitura!

O .NET Reactive Framework (Rx) possibilita LINQ em eventos

por Abel Avram , traduzido por Marcus Rehm em 05 Ago 2009 |

Erik Meijer e Wes Dyer criaram o .NET Reactive Framework (Rx), o complementar matemático ao "LINQ to Objects", que permite a programadores usar LINQ sobre eventos.

Programação Reativa não é algo novo. Já são utilizada em Cells, uma extensão para "datafloes" em Common Lisp, ou em Trellis, uma extensão para Python para suporte a programação reativa. Em C#, um programador utiliza programação reativa sempre que escreve uma função "callback" para uma operação assíncrona ou para tratamento de eventos. Quando uma operação assíncrona termina ou quando um tratamento para eventos é executado, um método é executado como uma reação ao evento.

"Linq to Objects" utiliza o par de interfaces IEnumerable / IEnumerator para percorrer uma coleção de dados. O método "MoveNext()" da interface IEnumerator é utilizado para ir de um elemento a outro e a propriedade "Current" para manipular o elemento corrente. Esse mecanismo utiliza um processo simples, bem entendido e amplamente utilizado. Erik descobriu que a interface IEnumerable possui uma característica interessante: assim como alguém pode obter um dado da coleção, pode também fazer inserções na mesma coleção. Isso representa o ponto de vista da programação reativa.

Teoricamente, a interface IEnumerable pode ser usada para incluir objetos em uma coleção, porém não pode ser utilizado em operações assíncronas pois o processo é bloqueado. Por este motivo, a equipe introduziu um novo par de interfaces: IObservable e IObserver. Um IObserver pode ser associado a uma coleção de dados através de um IObservable. Quando um novo dado está disponível, este pode ser inserido na coleção sendo passado para o IObservable, que no momento adequado a passa para o IObserver. Jafar Husain, um desenvolvedor da equipe de Plataforma de Controles de Apresentação da Microsoft, explica como o padrão IObserver é utilizado:

Para percorrer um IObservable você deve utilizar as mesmas ações que um IEnumerable, porém, ao contrário. Você cria um IObserver, passa para um IObservable, e o IObservable insere os dados no IObserver invocando seus métodos. Quando um IObservable executa o método "OnUpdate" de um IObserver isso é equivalente a um IEnumerable utilizar o comando "yeld" para passar informações para um IEnumerable. Similar, quando um IObservable executa o método "OnComplete" de algum IObserver é equivalente a um IEnumerable utilizar o comando break para informar que não há mais dados..

Para que serve isso? Esta abordagem parece ótima para tratar eventos. Pode-se associar um IObserver a eventos de mouse e gravá-los de forma assíncrona em uma coleção de dados para, posteriormente, utilizar LINQ em consultas sobre esses dados e processá-los da forma desejada. Para demonstrar o poder no tratamento de eventos de interface, o framework Rx foi utilizado no "Silverlight Toolkit Unit Test" e está sendo incluído no seu código fonte, na biblioteca System.Reactive.dll. O Rx também será disponibilizado no framework 4.0.

Brian Beckman, arquiteto de software e astro-físico, comenta mais sobre o assunto e dá mais informações nesta entrevista em vídeo com Erik Meijer.

Olá visitante

Você precisa cadastrar-se no InfoQ Brasil ou para enviar comentários. Há muitas vantagens em se cadastrar.

Obtenha o máximo da experiência do InfoQ Brasil.

Dê sua opinião

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

Receber mensagens dessa discussão
Comentários da comunidade

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

Receber mensagens dessa discussão

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

Receber mensagens dessa discussão

Dê sua opinião

Conteúdo educacional

Feedback geral
Bugs
Publicidade
Editorial
InfoQ Brasil e todo o seu conteúdo: todos os direitos reservados. © 2006-2014 C4Media Inc.
Política de privacidade
BT