2012-02-14 18 views
5

Eventuali duplicati:
When to Use Static Classes in C#se utilizzare classe statica o no

scriverò codice in cui ho bisogno di classe che contiene solo metodi. Ho pensato che fosse una buona idea rendere la classe statica. Alcuni programmatori esperti sostengono che non si usi la classe statica. Non trovo alcuna buona ragione per non utilizzare la classe statica. Qualcuno sa nel linguaggio C# c'è qualche danno nell'usare la classe statica. L'utilizzo statico della classe può richiedere più memoria rispetto alla creazione dell'oggetto di classe? Farò in modo che la mia classe non abbia un campo singolo e quindi anche la proprietà.

Per ulteriori informazioni, spiegherò anche il codice.

Abbiamo prodotto in cui è necessario eseguire la gestione XML per le impostazioni del grafico. Leggiamo l'oggetto dal file XML nella libreria di classi che contiene le proprietà relative al grafico. Ora ho due Layer in primo luogo è la libreria di seconda classe del prodotto e le operazioni relative all'XML. In realtà i programmatori senior vogliono che la classe indipendente legga e scriva XML. Rendo statica questa classe.

In un'altra situazione ho classe di chartData. In quella classe voglio metodi come Line of Axis, serie di grafici validi o no. Anche se il colore del grafico viene memorizzato nel formato ARGB o nel nome del colore semplice. Non vogliono quei metodi nello stesso progetto. Ora posso rendere statica la classe o creare oggetti.

+0

Questi programmi probabilmente non hanno mai utilizzato classi statiche e pertanto li considerano inutili. Fidati di me: non lo sono. –

+5

Come regola generale, chiunque ti dica che dovresti * "mai" * usare un particolare codice o modello di progettazione è probabilmente errato ... –

+0

Non ha detto "mai". Mi piacerebbe sapere cosa voleva mettere nella classe statica. Forse ha ragione. Ad ogni modo, penso che sia una buona domanda (e anche che le classi statiche sono davvero utili). – ivowiblo

risposta

4

Se la classe non deve gestire lo stato, non vi è assolutamente alcun motivo per non dichiararlo statico.

In C# alcune classi devono anche essere statiche come quelle che hanno metodi di estensione.

Ora se c'è la possibilità che richieda lo stato in futuro, è meglio non dichiararlo statico come se lo si modificasse in seguito, anche i consumatori dovranno cambiare il loro codice.

+1

Tranne che è impossibile eliminare le classi statiche durante il test delle unità. Utilizzare solo classi statiche quando la logica non deve mai essere sostituita. – Steven

+0

@Steven Hai un punto, ma ciò non significa che le classi statiche non possano essere testate da unità. Molte classi statiche contengono metodi di supporto senza effetti collaterali che possono essere facilmente testati su unità senza richiedere derisione. –

+1

@Steven - divertente, posso prendere in giro qualsiasi cosa nei miei test di Iunit. Classi statiche, classi di sistema, chiamate di metodo specifiche. Lezioni sigillate Forse usare un quadro di simulazione migliore? – TomTom

3

Il pericolo delle classi statiche è che spesso diventano oggetti di Dio. Sanno troppo, fanno troppo e solitamente si chiamano "Utilities.cs".

Inoltre, solo perché la classe tiene solo i metodi non significa che non è possibile utilizzare una classe regolare, ma dipende da ciò che fa la classe. Ha qualche stato? Persiste qualche dato che viene modificato nei tuoi metodi?

-5

Alcuni programmatori esperti sostengono che non utilizzare la classe statica.

Digli che è un tirocinante, nemmeno un giovane. Semplice. La parola chiave statica è lì per un motivo. se la tua classe ha solo metodi senza mantenere lo stato - e questi casi esistono - allora è valido metterli in una classe statica. Punto.

Qualcuno sa che in linguaggio C# c'è qualche danno nell'usare la classe statica.

No. L'unico argomento valido è che il tuo progetto è interrotto (vale a dire che la classe non deve essere statica e mantenere lo stato). Ma se davvero hai metodi che non mantengono lo stato - e quei casi esistono, come la classe "Matematica" - allora scusa, questo è un approccio totalmente valido. Non ci sono negativi.

+2

Dicendo che è un tirocinante proprio per questo (E inoltre, senza sapere come appare la classe attuale, che codice ha) è ugualmente ignorante.C'è anche la parola chiave Goto e vorrei vederti difendere;) – ivowiblo

+0

Forse. Allora metà delle persone là fuori sono sotto la media in qualsiasi cosa, sai. A chi importa se il suo orgoglio è ferito se gli crede di pensare. No per favore smettila di darmi fastidio. – TomTom

1

Avere classi statiche non è male, ma potrebbe farti pensare perché hai quei metodi lì. Alcune cose da tenere a mente a tale proposito:

se i metodi di gestire il comportamento per le classi che avete nel vostro progetto, si può solo aggiungere i metodi di queste classi direttamente:

//doing this: 
if(product.IsValid()) { ... } 

//instead of: 
if(ProductHelper.IsValid(product)) { ... } 

se i metodi di gestire il comportamento di classi non è possibile modificare, è possibile utilizzare metodi di estensione (che entro la fine della giornata sono statici! ma aggiunge zucchero sintattico)

public static bool IsValid(this Product product) { ... } 

//so you can do: 
if(product.IsValid()) { ... } 

se i metodi sono accoppiati a servizi esterni si consiglia di prendere in giro, utilizzando una classe non statica con metodi virtuali o i ATTUAZIONE un'interfaccia ti consente di sostituire l'istanza con uno mock quando è necessario utilizzare:

//instead of: 
StaticService.Save(product); 

//you can do: 
public IService Service {get;set;} 
... 
Service.Save(product); 

//and in your tests: 
yourObject.Service = new MockService(); //MockService inherits from your actual class or implements the same IService interface 

dall'altra parte, avendo la logica in classi non statici permette di fare uso di polimorfismo e sostituire la istanza con un altro che estende il comportamento.

infine, avere la logica in classi non statiche consente di utilizzare IoC (inversione del controllo) e AOP basato su proxy. Se non lo sai, puoi dare un'occhiata a framework come Spring.net, Unity, Castle, Ninject, ecc. Solo per darti un esempio di cosa potresti fare con questo: puoi fare in modo che tutte le classi implementino IService registra i loro metodi, o controlla alcuni vincoli di sicurezza, o apre una connessione al database e chiude quando termina il metodo; tutto senza aggiungere il codice effettivo alla classe.

Spero che aiuti.

+0

perché il voto scende ???? – ivowiblo

5

Una preoccupazione è che statica può essere più difficile (non impossibile) per testare in alcune situazioni

-1

Dipende dalla situazione in cui utilizzare statici classi o no. Nel caso generale, si creano classi statiche quando non è necessario gestire lo stato. Quindi, ad esempio, Math.cs o Utility.cs - dove sono presenti funzioni di utilità di base, ad esempio la formattazione delle stringhe, ecc.

Un altro scenario in cui si desidera utilizzare la statica è quando ci si aspetta che la classe non venga modificata molto. Quando il sistema cresce e si scopre che è necessario modificare questa classe statica, è meglio rimuovere la parola chiave statica. In caso contrario, perderai alcuni vantaggi dell'OOD, ad esempio il polimorfismo e le interfacce. Ad esempio, potresti scoprire che è necessario modificare un metodo specifico in una classe statica, ma poiché non puoi eseguire l'override di un metodo statico, potresti devi "copiare e incollare" con piccole modifiche.

Problemi correlati