Quais são alguns casos em que as árvores de expressão são úteis?
-
09-06-2019 - |
Pergunta
Entendo perfeitamente o conceito de árvores de expressão, mas estou tendo dificuldade em encontrar situações em que elas sejam úteis.Existe uma instância específica em que as árvores de expressão podem ser aplicadas?Ou é útil apenas como mecanismo de transporte de código?Sinto que estou faltando alguma coisa aqui.Obrigado!
Solução
Ou é útil apenas como mecanismo de transporte de código?
É útil como mecanismo de execução para código.Usando o padrão de intérprete, as árvores de expressão podem ser interpretadas diretamente.Isso é útil porque é muito fácil e rápido de implementar.Esses intérpretes são onipresentes e usados mesmo em casos que parecem não “interpretar” nada, por ex.para imprimir estruturas aninhadas.
Outras dicas
Algumas estruturas de simulação de teste unitário fazem uso de árvores de expressão para configurar expectativas/verificações fortemente tipadas.Ou seja:
myMock.Verify(m => m.SomeMethod(someObject)); // tells moq to verify that the method
// SomeMethod was called with
// someObject as the argument
Aqui, a expressão nunca é realmente executada, mas a própria expressão contém informações interessantes.A alternativa sem árvores de expressão seria
myMock.Verify("SomeMethod", someObject) // we've lost the strong typing
As árvores de expressão são úteis quando você precisa acessar a lógica da função para alterá-la ou reaplicá-la de alguma forma.
Linq to SQL é um bom exemplo:
//a linq to sql statement
var recs (
from rec in LinqDataContext.Table
where rec.IntField > 5
select rec );
Se não tivéssemos árvores de expressão, esta instrução teria que retornar todos os registros e, em seguida, aplicar a lógica where do C# a cada um.
Com árvores de expressão que where rec.IntField > 5
pode ser analisado em SQL:
--SQL statment executed
select *
from [table]
where [table].[IntField] > 5