Classi statiche e / o singoletti - Quanto ci vuole per diventare un odore di codice? [chiuso]

1

Nei miei progetti uso un bel po 'di classi statiche. Di solito sono classi che sembrano adattarsi a un tipo di cosa a istanza singola. Molte volte uso classi statiche e recentemente ho iniziato a usare alcuni singleton.

Quanti di questi servono per diventare un odore di codice? Ad esempio, nel mio recente progetto che ha un sacco di classi statiche c'è una libreria di autenticazione per ASP.Net.

Uso una classe statica per una classe helper che corregge i codici di errore di ASP.Net in modo che possa essere usata come

CustomErrorsFixer.Fix(Context);

Oppure la mia classe di autenticazione stessa è una classe statica

//in global.asax's begin_application
Authentication.SomeState="blah";
Authentication.SomeOption=true;
//etc

//in global.asax's begin_request
Authentication.Authenticate();

Quando le classi statiche o singleton sono cattive da usare? Sto sbagliando, o sono solo in un progetto che per definizione ha pochissimo stato per-instance associato ad esso?

L'unico stato per istanza che ho è memorizzato in HttpContext.Current.Items in questo modo:

    /// <summary>
    /// The current user logged in for the HTTP request. If there is not a user logged in, this will be null.
    /// </summary>
    public static UserData CurrentUser{
        get{
            return HttpContext.Current.Items["fscauth_currentuser"] as UserData; //use HttpContext.Current as a little place to persist static data for this request
        }
        private set{
            HttpContext.Current.Items["fscauth_currentuser"]=value;
        }
    }
    
posta Earlz 17.04.2011 - 05:22
fonte

6 risposte

8

Come byte sottolinea , i singleton sono spesso abusati. Tuttavia, sono spesso sovrautilizzati perché sono usati dove un'istanza statica sarebbe migliore. Dalla tua domanda sembri implicare che sono la stessa cosa o sono intercambiabili. Non sono la stessa cosa, e anche se in alcuni casi possono essere intercambiabili, di solito c'è una buona ragione per preferire l'una rispetto all'altra.

Non penso che nessun numero specifico di statici o singleton sia cattivo, ci possono essere alcuni casi in cui si utilizza molto l'uno o l'altro, in alcuni casi dove non lo si fa.

Penso che le cose da considerare e chiedersi siano, X ha bisogno di essere un singleton, può essere statico. Di solito se qualcosa ha bisogno di vivere ed essere accessibile per tutta la durata del suo scope allora dovrebbe essere statico, se è qualcosa a cui non si può mai accedere, può essere costoso da creare e si ha sempre bisogno di uno quindi un singleton è migliore.

    
risposta data 17.04.2011 - 12:58
fonte
2

Nel caso dei singleton la risposta è una - perché un singleton è una variabile globale. Certo, è vestito con un odore molto più bello di una variabile globale tradizionale, e sicuramente offre vantaggi (come la scoping privata) che le variabili globali tradizionali non hanno, ma una variabile globale è ancora quella che è.

    
risposta data 01.07.2012 - 18:07
fonte
1

Non credo che ci sia una sorta di limite sul numero di singleton che ci sono. Nel mio attuale progetto quasi tutte le classi sono singletons (30 e in crescita). E interagiscono tra loro in modalità fornitore-consumatore. Ha funzionato bene per oltre un anno. Il trucco sta nell'assicurarsi che ci sia un piccolo accoppiamento diretto tra di loro e li chiami solo quando hai bisogno del servizio. A volte è necessario un piccolo juglery, in situazioni come l'avvio dell'applicazione. Ma funziona bene per me.

    
risposta data 17.04.2011 - 12:46
fonte
0

Non c'è alcun numero di soglia o percentuale che possa causare l'improvviso odore del codice. Tutto dipende dalle tue esigenze.

Ad esempio, se il tuo requisito era quello di costruire una libreria di classi che implementasse diverse funzioni matematiche come sin , cosine e abs , il tuo rapporto tra metodi statici e non statici potrebbe essere vicino al 100%.

I single sono scoraggiati per una serie di motivi, che sono facilmente disponibili su Google. Come con tutti i modelli, dovresti limitare il suo uso a ciò che è appropriato. Ma ancora una volta, non esiste una soglia target, al di sopra della quale inizia a puzzare. Se il tuo requisito è quello di costruire un sistema di configurazione globale, o qualcosa di simile, di nuovo: la tua percentuale di classi Singleton per non-singleton potrebbe essere vicina al 100%.

    
risposta data 17.04.2011 - 06:28
fonte
0

La ragione per cui sono spesso un odore di codice è che Singleton è creare un globale . Se si richiede che uno stato sia globale per l'applicazione e memorizzato per la vita dell'applicazione, allora Singletons potrebbe essere una buona idea. Il problema principale è che stai rimuovendo la possibilità per il programmatore di decidere se vogliono che lo stato sia globale o temporaneo.

Il motivo per cui i metodi statici sono spesso un codice olfattivo è che sono spesso usati per funzioni dello spazio dei nomi . Il problema è che i metodi statici rendono estremamente difficile il test dell'unità, per estendere e sostituire la funzionalità. Se voglio usare la mia classe, devo passare attraverso l'intero codice sorgente e sostituire il riferimento ogni alla tua chiamata al metodo statico. Se non ho il tuo codice sorgente, beh, o mi occupo di esso, uso un'altra libreria o riscrivo tutte le classi che fanno riferimento al metodo statico.

Come puoi vedere, i metodi statici possono essere più che un odore di codice, possono essere decisamente la lotta alla produttività. Se la libreria verrà utilizzata solo dall'autore, alla fine non avrà molta importanza.

    
risposta data 11.04.2014 - 07:20
fonte
0

Le classi statiche sono quasi sempre un cattivo odore perché rendono difficile il test delle unità. Non è possibile creare simulazioni o creare versioni di test di una classe statica. Se qualcuno del tuo codice è un client di una classe statica, allora c'è un accoppiamento stretto tra le due classi.

Invece delle classi statiche, dovresti utilizzare un oggetto normale ma gestirlo con un contenitore Inversion of Control.

    
risposta data 16.04.2014 - 10:31
fonte

Leggi altre domande sui tag