Domanda

sono classi statiche considerati cattiva pratica? Ho letto un articolo su questo un paio di giorni fa (non riesce a trovare, mi dispiace), che in sostanza ha detto che le classi statiche che hanno (specialmente quelle classi 'helper') sono in genere un segno di cattivo codice. È questo corretto, in caso affermativo, per quali ragioni?

È stato utile?

Soluzione

L'abuso di classi statiche può essere considerato una cattiva pratica. Ma così può l'abuso di qualsiasi caratteristica del linguaggio.

non faccio distinzioni tra una classe non-statico con solo metodi statici e una classe statica. Essi sono effettivamente la stessa cosa, tranne che le classi statiche permettono al compilatore di far rispettare gli sviluppatori intenti (senza istanziazione questa classe, la sintassi comoda per l'accesso la sua funzionalità, ecc ).

Come dici tu, una proliferazione di corsi di "aiuto" si può ottenere nei guai (progettazione, manutenzione, la leggibilità, la reperibilità, altri-abilità ...). Nessun argomento qui. Ma si può sostenere che una classe "Helper" è non appropriato? Ne dubito.

In effetti, l'uso responsabile delle classi statiche può avere grandi benefici per il vostro codice:

  • La classe statica Enumerable fornisce un insieme di metodi di estensione la maggior parte di noi hanno imparato ad amare. Si tratta di un insieme logico di logica funzionalità / incassi che non è legato a un'istanza di qualsiasi tipo.
  • I servizi forniti dal l'ambiente / contesto: ad esempio, registrazione, configurazione (a volte)
  • Altri (che non riesco a pensare in questo momento:))

Quindi no, in generale, la sua non è una cattiva pratica. Basta usarli con saggezza ...

Altri suggerimenti

significa "L'utilizzo di classi statiche è sbagliato" (in questo caso l'articolo è corretto) o "classi statiche si trovano spesso nel codice scritto male" (nel qual caso non è detto che le classi statiche in se stesse sono cattivi, ma che essi sono a volte utilizzati in modo non corretto)

funzioni statiche sono più efficienti rispetto ai non-statico perché non c'è bisogno di creare un'istanza di un oggetto da utilizzare loro o passare un puntatore 'this' in chiamate di metodo.

L'utilizzo di classi statiche per contenere le variabili globali è una questione diversa - nel qual caso la regola di fondo non è che "statica sono cattivi", ma "globali sono cattivi"

.

Credo che l'argomento generale è contro il mantenimento dello stato mutabile in classi statiche, e fondamentalmente li utilizzano come variabili globali. Non c'è niente di sbagliato con metodi di supporto statici in una classe statica.

E sul motivo per cui le variabili globali sono cattivi, sono sicuro che tra qui e Google troverete mezzo milioni di pagine e post di blog su di esso.

No, non è proprio corretto.

Ci sono un sacco di funzioni che non sono specifici di un'istanza di un oggetto, e che non necessitano di Stato. Per esempio in considerazione le funzioni 'matematica'.

Quasi tutte le lingue hanno qualcosa di simile:

y = Math.round(x);

Quindi, la funzione 'round' è statico. Si potrebbe, se tu fossi pazzo, discutere di qualcosa di simile (C #):

class RoundFunction<T> : GeneralMathFunction<T>
{
    public override T Operate (params object[] variables) {
        ..
    }
}

Ma, secondo me, si sarebbe un po 'strano per farlo.

Certamente c'è un momento in cui troppe funzioni statiche, sono un segno di qualcosa andato storto, ma, entro limiti ragionevoli, non è 'cattivo'.

Ecco alcuni link ad alcuni google messaggi test del blog sul perché i metodi statici possono danneggiare la verificabilità del codice, così come il motivo per cui i metodi statici (che sono la parte cattiva di classi statiche) introdurre tutti i tipi di attacco potenzialmente sorprendente e interazione tra i componenti.

come pensare oo

singletons

static-metodi-sono- morte-per-verificabilità

Ci sono bisogni in cui si dispone di una classe di utilità in cui tutti i metodi sono statici. In tal caso, se si effettua la classe statica che indica chiaramente la vostra intenzione. E almeno in C # non si può avere metodi non statici all'interno di una classe statica.

Io uso classi di utilità statiche per tutto il tempo nel mio codice per i metodi che vengono chiamati molto spesso, ma sarebbe un dolore per instanciate. Un esempio potrebbe essere una semplice classe di registrazione come:

public static class Logging
{
  public static UpdateAction(int id, object data)
  {
     SqlConnection connection = new SqlConnection("conn string from config file");
     // more logic here...
  }
}

Ora, in nessun modo posso mai avere quelle classi e metodi archiviare qualsiasi tipo di stato globale dal momento che può portare a problemi concurrancy enormi e, in generale, è solo cattiva progettazione.

Quindi, non evitare di classi statiche, basta evitare di avere queste classi statiche mantengono una sorta di stato globale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top