Quels sont les cas dans lesquels les arbres d’expression sont utiles ?
-
09-06-2019 - |
Question
Je comprends parfaitement le concept des arbres d'expression, mais j'ai du mal à trouver des situations dans lesquelles ils sont utiles.Existe-t-il un cas spécifique dans lequel les arbres d'expression peuvent être appliqués ?Ou est-il uniquement utile comme mécanisme de transport pour le code ?J'ai l'impression qu'il me manque quelque chose ici.Merci!
La solution
Ou est-il uniquement utile comme mécanisme de transport pour le code ?
C'est utile comme mécanisme d'exécution pour le code.En utilisant le modèle d'interprète, les arbres d'expression peuvent être directement interprétés.Ceci est utile car c’est très simple et rapide à mettre en œuvre.De tels interprètes sont omniprésents et utilisés même dans les cas qui ne semblent rien « interpréter », par ex.pour imprimer des structures imbriquées.
Autres conseils
Certains frameworks de simulation de tests unitaires utilisent des arbres d'expression afin de mettre en place des attentes/vérifications fortement typées.C'est à dire:
myMock.Verify(m => m.SomeMethod(someObject)); // tells moq to verify that the method
// SomeMethod was called with
// someObject as the argument
Ici, l’expression n’est jamais réellement exécutée, mais l’expression elle-même contient les informations intéressantes.L'alternative sans arbres d'expression serait
myMock.Verify("SomeMethod", someObject) // we've lost the strong typing
Les arbres d'expression sont utiles lorsque vous devez accéder à la logique des fonctions afin de la modifier ou de la réappliquer d'une manière ou d'une autre.
Linq to SQL est un bon exemple :
//a linq to sql statement
var recs (
from rec in LinqDataContext.Table
where rec.IntField > 5
select rec );
Si nous n'avions pas d'arbres d'expression, cette instruction devrait renvoyer tous les enregistrements, puis appliquer la logique C# Where à chacun.
Avec des arbres d'expression qui where rec.IntField > 5
peut être analysé en SQL :
--SQL statment executed
select *
from [table]
where [table].[IntField] > 5