2012-07-04 11 views
11

Eventuali duplicati:
Extension Methods vs Static Utility Classvs. classe helper

Sto costruendo un'API di funzioni generali che eseguono azioni basate su oggetti in .NET. Per esempio; Ho creato una funzione che controlla una stringa per vedere se si tratta di un indirizzo email.

Potevo avere:

static bool IsEmailAddress(string text) 
{ 
    return IsMail(text); 
} 

o ho potuto creare un metodo di estensione che sarebbe stato utilizzato in questo modo:

string text = "[email protected]"; 
if (text.IsEmailAddress()) 
{ 
} 

, che è più adatto, o pensi che dal momento che questo è un libreria generica, potrei tecnicamente implementarla in entrambi i modi e consentire allo sviluppatore di decidere quale sia la soluzione migliore per loro?

+7

** BTW: ** utilizzare 'return IsMail (text)' invece dell'istruzione if. –

+0

Mi piacerebbe andare con i metodi di estensione E il refactoring di Mahmoud suggerito. –

+3

Penso che non sia responsabilità di 'string' sapere quale sia l'indirizzo di posta elettronica. Quindi non penso che questo dovrebbe essere un metodo di estensione. – CodesInChaos

risposta

12

Creazione di un metodo di estensione significa che verrà visualizzato automaticamente durante intellisense quando un utente utilizza quel tipo. Bisogna stare attenti a non aggiungere un sacco di rumore all'elenco dei metodi che gli sviluppatori navigano (specialmente quando si crea un framework riutilizzabile). Ad esempio, quando quei metodi sono utilizzabili in un certo contesto, probabilmente è meglio usare metodi statici "normali". Soprattutto quando si implementano metodi di estensione per tipi generali come string.

Prendere ad esempio un metodo di estensione ToXml(this string) o un metodo di estensione ToInt(this string). Anche se sembra abbastanza conveniente avere questi metodi di estensione, la conversione di testo in XML non è qualcosa che si farà in tutta l'applicazione e sarebbe altrettanto facile da fare XmlHelper.ToXml(someString).

C'è solo una cosa peggiore, e cioè aggiungere un metodo di estensione su object.

Se si sta scrivendo un framework riutilizzabile, the book Framework-Design-Guidelines by Krzysztof Cwalina è un assoluto da leggere.

+1

Non dimenticare che l'estensione è associata allo spazio dei nomi, quindi finché non specifichi uno spazio dei nomi di estensione nella classe client, intellisense per i metodi della tua estensione non verrà visualizzato. Un'altra cosa che estensione è davvero? - dopo la compilazione - è una classe statica con metodo statico - quindi preferisco usare le estensioni come zucchero sintattico e avere una buona struttura dei miei spazi dei nomi piuttosto che creare StaticHelpers. –

2

Preferisco il metodo di estensione, perché il codice è elegante ed è possibile definire un metodo di estensione su una classe sigillata del framework.

0

Un metodo di estensione è automaticamente parte di una classe statica. Ciò significa che il consumatore può utilizzare i metodi di estensione o chiamare il metodo statico dalla classe se lo desidera. Uso i metodi di estensione il più possibile, sono più facili da scoprire se vengono inseriti nello spazio dei nomi corretto.

0

I metodi di estensione consentono agli sviluppatori di non essere a conoscenza esattamente di ciò che viene chiamata la classe helper e dove si trova, per non parlare del fatto stesso della sua esistenza. Nota che devi ancora inserire il loro spazio dei nomi nella clausola using, magari inserendoli in uno spazio dei nomi comune di primo livello per la tua applicazione.

2

La domanda è quale .NET Framework scegli come target? Se < 3.5 i metodi di estensione non sono disponibili. Altrimenti, perché dovresti creare una nuova classe?

Problemi correlati