12.07.2013 Views

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

SHOW MORE
SHOW LESS

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);

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!