BT

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.

Avalie esse artigo

Relevância
Estilo/Redação

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
Feedback geral
Bugs
Publicidade
Editorial
Marketing
InfoQ Brasil e todo o seu conteúdo: todos os direitos reservados. © 2006-2016 C4Media Inc.
Política de privacidade
BT

We notice you’re using an ad blocker

We understand why you use ad blockers. However to keep InfoQ free we need your support. InfoQ will not provide your data to third parties without individual opt-in consent. We only work with advertisers relevant to our readers. Please consider whitelisting us.