Etude exploratoire de Linq - CoDE - de l'Université libre de Bruxelles
Etude exploratoire de Linq - CoDE - de l'Université libre de Bruxelles
Etude exploratoire de Linq - CoDE - de l'Université libre de Bruxelles
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
2.2.4 Extensions <strong>de</strong> métho<strong>de</strong><br />
« Extension <strong>de</strong> métho<strong>de</strong> » est le terme utilisé pour ajouter une métho<strong>de</strong> à une classe donnée sans<br />
manipuler le co<strong>de</strong> <strong>de</strong> cette classe. Cela reviendrait à créer une classe héritant <strong>de</strong> la classe <strong>de</strong> base en<br />
spécifiant la ou les métho<strong>de</strong>s que l’on souhaite y ajouter. Plus qu’une facilité syntaxique, l’extension<br />
<strong>de</strong> métho<strong>de</strong> permet d’éviter les pièges tendus par l’héritage et n’introduit pas <strong>de</strong> biais conceptuel<br />
dans la programmation. Une extension <strong>de</strong> métho<strong>de</strong> ne peut utiliser que les champs publics <strong>de</strong> la<br />
classe dont elle est l’extension. Elle doit elle-même être déclarée comme publique et statique. Son<br />
premier paramètre doit être précédé du mot-clé this et le type <strong>de</strong> ce paramètre définit le type dont<br />
la métho<strong>de</strong> est une extension. Le co<strong>de</strong> suivant (tiré <strong>de</strong> [11]) montre une extension <strong>de</strong> métho<strong>de</strong> ayant<br />
pour effet <strong>de</strong> représenter un nombre décimal sous forme <strong>de</strong> chaîne <strong>de</strong> caractères au format standard<br />
US :<br />
//Exemple fourni par <strong>Linq</strong> in Action<br />
public static string FormattedUS( this <strong>de</strong>cimal d) {<br />
return String.Format( formatUS, "{0:#;0.00}", d);<br />
}<br />
L’utilisation <strong>de</strong>s extensions <strong>de</strong> métho<strong>de</strong>s donnera peut-être l’impression <strong>de</strong> faire double emploi avec<br />
les métho<strong>de</strong>s virtuelles mais il faut gar<strong>de</strong>r à l’esprit qu’une métho<strong>de</strong> virtuelle est résolue à<br />
l’exécution alors qu’une extension <strong>de</strong> métho<strong>de</strong> doit être résolue dès la compilation. Précisons enfin<br />
que le type étendu peut être générique, ce qui offre la possibilité d’étendre un ensemble <strong>de</strong> types<br />
simultanément.<br />
Typiquement, les extensions <strong>de</strong> métho<strong>de</strong>s sont utilisées lors <strong>de</strong> l’appel <strong>de</strong> clauses dans les requêtes<br />
comme les clauses Where ou Select. Le framework .NET dans sa version 3 propose une interface<br />
générique IEnumerable pour représenter toute donnée susceptible <strong>de</strong> faire l’objet d’une requête<br />
ou d’une manipulation propre aux données. Des extensions <strong>de</strong> métho<strong>de</strong>s sont définies pour chaque<br />
clause avec cette interface (ou l’un <strong>de</strong> ses <strong>de</strong>scendants) comme type étendu.<br />
2.2.5 Formalisme <strong>de</strong> requêtes<br />
Cette sous-section s’inspire très fortement <strong>de</strong> *1+ et *11+. Les expressions <strong>de</strong> types requêtes ont été<br />
introduites avec la troisième version du framework .NET et définissent la forme générale d’une<br />
requête lorsqu’elle est écrite en C# ou en Visual Basic 2008. Une requête apparaît ici au sens large<br />
puisque la syntaxe sera la même que ce soit une requête vers une base <strong>de</strong> données relationnelle,<br />
vers une liste d’objets en mémoire ou encore vers un fichier XML. Une requête correctement<br />
formulée doit commencer par une clause From et se terminer par une clause Select ou une clause<br />
group. La clause From indique quels types d’objets vont être interrogés et ceux-ci doivent<br />
implémenter l’interface IEnumerable représentant une collection <strong>de</strong> données générique<br />
susceptible <strong>de</strong> faire l’objet d’une requête. Chaque clause <strong>de</strong> l’expression correspond à un ou<br />
plusieurs appels d’extensions <strong>de</strong> métho<strong>de</strong>s pour l’interface citée précé<strong>de</strong>mment. Voici un exemple<br />
<strong>de</strong> requête typique :<br />
var query = from e in etudiants<br />
where e.moyenne >= 10<br />
select e;<br />
Le compilateur interprétera l’expression ci-<strong>de</strong>ssus <strong>de</strong> la manière suivante :<br />
var query = etudiants.Where(e => e.moyenne >= 10).Select(e => e);