2010-03-29 22 views
5

Attualmente abbiamo una classe di utilità che gestisce un sacco di formattazione di stringhe, visualizzazioni di date e funzionalità simili ed è una classe condivisa/statica.Best Practice per la classe di utilità?

È questo il modo "corretto" di fare le cose o dovremmo creare un'istanza della classe di utilità come e quando ne abbiamo bisogno?

Il nostro obiettivo principale è ridurre l'ingombro della memoria ma anche le prestazioni dell'applicazione.

PS. Stiamo usando .NET 2.0

+0

Non sarei preoccupato per la differenza di memoria tra una classe statica e la creazione di un'istanza. Se non ci sono campi di classe (che sembra non esserci) occuperà solo una manciata di byte per istanza attiva della classe. –

risposta

3

Se c'è qualche stato nella classe, allora è meglio creare degli oggetti. I singleton sono un dolore, per quanto riguarda le dipendenze degli oggetti e la sicurezza dei thread.

Se non ci sono stati nella classe, la scelta se renderla statica o meno non avrà effetti apprezzabili sull'impronta di memoria.

3

Se stai usando .NET, hai studiato i metodi di estensione? Ho trovato che con l'uso appropriato potrei anche non aver bisogno di una classe di utilità.

+0

L'autore non ha menzionato che si tratta di C#. –

+0

I metodi di estensione non sono specifici per C#, ma richiedono una versione più recente del framework rispetto alla 2.0. – Barry

0

Si trova in .NET? Se è così, potrebbe essere meglio fornire metodi di estensione. Per esempio. se si dispone di un metodo di utilità che formatta una stringa, modificare la propria firma dalla

public static string SpecialFormat(string text) 

a

public static string SpecialFormat(this string text) 

In questo modo, il metodo SpecialFormat sarà molto più rilevabile dal momento che apparirà come un metodo su stringa .

0

Se la lingua lo supporta, rendere queste funzioni parte di un pacchetto/spazio dei nomi/modulo invece di una classe.

In caso contrario, i metodi statici di una classe vanno bene. Dovresti contrassegnare la classe finale/chiuso/non virtuale/non estendibile se la tua lingua lo supporta.

Se la lingua lo supporta, è possibile prendere in considerazione la ridefinizione delle classi/definizioni predefinite per i tipi accettati da tali funzioni, ma attenzione alle collisioni nello spazio dei nomi. In questo caso, rimanda alla guida allo stile o allo standard de facto della tua lingua preferita per scegliere l'approccio idiomatico.

0

Le classi statiche vanno bene per ciò che hai descritto, ma fai attenzione che qualsiasi stato condiviso (variabili membro statiche) sia condiviso in modo thread-safe.

4

È questo il modo "corretto" di fare le cose o dovremmo installare la classe di utilità come e quando ne abbiamo bisogno?

Dal punto di vista OOD dipende :-)

Per pure functions si dovrebbe usare metodi statici in Java/C#. In C# puoi anche provare a utilizzare i metodi di estensione come altri descrivono.

Per i metodi di utilità che non sono funzioni pure (ad esempio la lettura di alcuni file), è necessario creare un'istanza per migliorare la testabilità (ad esempio, consentire il mocking).

La differenza è che questi ultimi, sebbene non mantengano uno stato direttamente, comunicano con alcuni componenti esterni che possiedono uno stato, eventualmente modificabile. Questo stato esterno può far sì che questo metodo di utilità restituisca risultati diversi nel tempo (per lo stesso input) rendendo molto più difficile testare e ragionare. È un buon principio di progettazione distinguere tra funzioni pure e tali metodi di utilità ponendo quest'ultimo come metodo di istanza esplicito.

Tuttavia, nella pratica Java, "l'argomento di simulazione" di solito prende la precedenza, poiché non consente di simulare i metodi statici.