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 une instance spécifique dans laquelle les arbres d'expression peuvent être appliqués? Ou est-ce seulement utile comme mécanisme de transport pour le code? J'ai l'impression qu'il me manque quelque chose ici. Merci!Dans quelles instances les arbres d'expressions sont-ils utiles?
Répondre
Ou est-il seulement utile en tant que mécanisme de transport pour le code?
Il est utile en tant que mécanisme d'exécution pour le code. En utilisant le interpreter pattern, les arbres d'expression peuvent être directement interprétés. Ceci est utile car il est très facile et rapide à mettre en œuvre. De tels interprètes sont omniprésents et utilisés même dans les cas où il ne semble pas "interpréter" quoi que ce soit, par ex. pour imprimer des structures imbriquées.
Certains frameworks de simulation de tests unitaires utilisent des arbres d'expression pour 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 l'information intéressante. L'alternative sans arbres d'expression serait
myMock.Verify("SomeMethod", someObject) // we've lost the strong typing
Les arborescences d'expression sont utiles lorsque vous devez accéder à la logique de fonction pour la modifier ou 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 l'expression des arbres cette déclaration devrait retourner tous les enregistrements, et ensuite appliquer le C#, où la logique à chacun.
Avec des arbres d'expression qui where rec.IntField > 5
peut être analysée en SQL:
--SQL statment executed
select *
from [table]
where [table].[IntField] > 5