Vă mulțumim pentru susținere

Care sunt cele mai bune practici pentru utilizarea metodelor de extindere în .Net?

Am văzut acestea fiind folosite în toate direcțiile, și au fost acuzați de ele folosind mod greșit (deși, în acest caz, am fost folosindu-le în acest fel pentru a demonstra o punct ).

Deci, ce credeți că sunt cele mai bune practici pentru utilizarea metodelor de extindere?

Ar trebui echipele de dezvoltare să creeze o bibliotecă de metode de extensie și să le implementeze în cadrul diferitelor proiecte?

Ar trebui să existe o colecție de metode comune de extensie sub forma unui proiect open source?

Actualizare: ați decis să creați o bibliotecă de metode de extensie la nivel de organizație

0
adăugat editat

6 răspunsuri

Am inclus metodele mele de extensie cu bibliotecile mele de bază din clasa Utils deoarece persoanele care lucrează cu cadrul meu vor găsi probabil metode utile, dar pentru implementarea în masă în cazul în care dezvoltatorul final ar putea avea o gamă de biblioteci de metode de extensie, Aș sfătui să puneți toate extensiile în propriul lor spațiu de nume, chiar în propriul fișier de proiect, astfel încât oamenii să poată alege să adauge o referință sau o declarație folosind sau pur și simplu acolo unde este necesar, cum ar fi:

Core.Extensions.Base64Encode(str);

Clasa mea Utils este cel mai bun prieten al meu din întreaga lume, a fost înainte ca metode de extensie să vină și au ajutat doar la întărirea relației noastre. Cea mai mare regulă pe care o voi face este să ofer oamenilor posibilitatea de a alege ce cadru de extindere folosesc acolo unde este posibil.

0
adăugat

Cred că depinde de ce scop servesc metodele Extensiei.

  • Metodele de extindere care se referă la nevoile specifice ale unui proiect (fie că sunt conectate la tipuri de date de bază sau obiecte personalizate) nu ar trebui să fie incluse într-o bibliotecă care să fie distribuită pe mai multe proiecte.
  • Metodele de extindere care se referă la tipurile de date de bază (int, șir etc.) sau generice care au o aplicație mai extinsă ar putea fi împachetate și distribuite în cadrul proiectelor.

Aveți grijă să nu includeți la nivel global metode de extindere care nu au o aplicație foarte mică, deoarece acestea se blochează doar prin intellisense și pot duce la confuzie și / sau abuz.

0
adăugat
Ei bine, da. Asa este. Dar ar trebui să existe orientări mai specifice. (de exemplu, ar trebui să extindeți clasa obiect?) Ar trebui să extindeți bibliotecile terților?
adăugat autor Vaibhav

poate doriți să aruncați o privire la http://www.codeplex.com/nxl și http://www.codeplex.com/umbrella care sunt ambele biblioteci de metode de extensie. Eu personal nu am avut o privire la codul sursă, dar sunt sigur că băieții de acolo ar fi în măsură să vă dau câteva indicii bune.

0
adăugat
Observând că nici unul dintre proiectele menționate nu pare să fi avut altă activitate de dezvoltare încă din 2008.
adăugat autor DavidRR

Următoarea versiune a Ghidului de proiectare cadru, ediția a II-a va avea câteva îndrumări pentru implementarea metodelor de extensie, dar în general:

Ar trebui să definiți numai metodele de extensie "unde fac sens" și oferă funcționalitate ajutoare relevante pentru fiecare implementare.

De asemenea, trebuie să evitați să extindeți System.Object deoarece nu toate limbile .NET vor putea să numească extensia ca extensie. (De exemplu, VB.NET ar trebui să o numească ca o metodă statică obișnuită pe clasa extensiei statice.)

Nu definiți o metodă de extensie în același spațiu de nume ca și tipul extins dacă nu extindeți o interfață.

Nu definiți o metodă de extensie cu aceeași semnătură ca o metodă "reală", deoarece nu va fi apelată niciodată.

0
adăugat

The Objective-C language has had "Categories" since the early 1990s; these are essentially the same thing as .NET Extension Methods. When looking for best practices you might want to see what rules of thumb Objective-C (Cocoa & NeXT) developers have come up with around them.

Brent Simmons (the author of the NetNewsWire RSS reader for Mac OS X and iPhone) just posted today about his new style rules for the use of categories and there's been a bit of discussion in the Cocoa community around that post.

0
adăugat

Când am aflat prima oară despre Extensii, le-am folosit foarte mult și le-am abuzat.

În cea mai mare parte, am început să scap de la utilizarea oricăror metode de extindere din mai multe motive.

Unele dintre motivele pentru care am încetat să le folosesc sunt menționate în link-ul de blog al lui Scott de mai sus, cum ar fi "Gândiți-vă de două ori înainte de a extinde tipurile pe care nu le dețineți". Dacă nu aveți control asupra sursei pentru tipurile pe care le extindeți, este posibil să întâmpinați probleme / coliziuni în viitor dacă tipul de sursă are unele adăugiri / modificări, cum ar fi mutarea proiectului dvs. într-o versiune mai nouă .NET. Dacă versiunea .NET mai recentă include o metodă pe tipul cu același nume ca și extensia dvs., cineva se va clătina.

Principalul motiv pentru care am încetat să folosesc metode de extensie este că nu puteți spune rapid din citirea codului în care este sursa metodei și care o "deține".

Când citiți doar codul, nu puteți spune dacă metoda este o extensie sau doar o metodă standard API NET pentru tipul respectiv.

Meniul intellisense poate deveni într-adevăr dezordonat foarte repede.

0
adăugat