Extension metoder og C#

by Israr Khan 29. november 2010 13:05

Hadde litt diskusjoner rundt bruk av extension metoder på jobben i dag - og særlig med tanke på hvor det er fornuftig å bruke dette, og også hvordan.

Vi kom frem til en grei "konklusjon" om du kan kalle det med følgende retningslinjer:

  • Extension metoder skal tilby generisk funksjonalitet som er relevant i mer enn en kontekst.
  • Extension metoder skal tilby utvidet funksjonalitet til interface, og ikke til konkret type. Er det nødvendig å spesifisere en konkret type på extension-metoden, bør det vurderes om funksjonaliteten som tilbys heller bør være i implementasjonen av selve typen og ikke som en extension. 
  • Unntaket fra regel om å alltid lage extension for ett gitt interface og ikke en konkret type - er når du har en type du ønsker å utvide funksjonaliteten til, men ikke har tilgang til å faktisk gjøre dette. I slike tilfeller er det godtatt å utvikle extensionmetoder for en konkret type som utvider funksjonaliteten til denne typen. Eksempler på dette kan f.eks. være for å utvide tredjeparts API eller typen "objekt". Det bør uansett vises forsiktighet ved bruk av extension-metoder da vedlikehold av slik "ekstern" funksjonalitet kan fort vise seg å medføre mer overhead enn f.eks. å følge patterns av typen adapter, fasade e.l.

Twitter-quote of the day:

Ole - André Johansen
@ I suggest putting all your code in Extension Methods for Object.

Sjekk også ut:
http://codebetter.com/blogs/gregyoung/archive/2007/12/05/a-use-for-extension-methods.aspx

Adapter pattern:
http://en.wikipedia.org/wiki/Adapter_pattern

Facade pattern:
http://en.wikipedia.org/wiki/Facade_pattern

 

Edit: Ole-André hadde et annet scenario hvor bruk av extension metoder kan virke fornuftig:

En annen gyldig bruk av extension methods, sånn jeg ser det, er for å gruppere funksjonalitet. Hvis man for eksempel har et objekt som er mye brukt i en kodebase, kan det være befriende å gruppere funksjonaliteten som extension methods i forskjellige namespaces.


For eksempel om man har et Person-objekt, og man vil ha pensjon og forsikringsmetoder i forskjellige "pakker" som man kan inkludere og bruke på Person. person.BeregnPensjon(), og person.BeregnForsikringsPremie() kan leve i to forskjellige namespaces. Da kan de som jobber med pensjon slippe å se forsikringslogikken.


Extension Methods; handle with care Smile

Tags: , , , , ,

Koding

Om meg

Kodeverk.net er drevet av .Net-utvikler Israr Khan.

Han jobber som gruppeleder og  seniorkonsulent for Capgemini Norge.

Hans fokusområder er alt innenfor .Net-verden, og har foreløpig tilgode å finne noe som han ikke finner av interesse innenfor teknologien. Han er drevet av genuin interesse for teknologi og lever for faget.


 

View Israr Khan's profile on LinkedIn

Month List