Frage

sind statische Klassen schlechte Praxis in Betracht gezogen? Ich las einen Artikel über diese vor ein paar Tagen (kann es nicht finden, sorry), die im Grunde gesagt, dass mit statischen Klassen (vor allem jene ‚Helfer‘ Klassen) sind in der Regel ein Zeichen von schlechter Code. Ist das richtig, und wenn ja, aus welchen Gründen?

War es hilfreich?

Lösung

Der Missbrauch von statischen Klassen kann schlechte Praxis in Betracht gezogen werden. Aber so kann der Missbrauch von jeder Sprache-Funktion.

Ich mache keinen Unterschied zwischen einer nicht-statischen Klasse mit nur statischen Methoden und einer statischen Klasse. Sie sind effektiv die gleiche Sache, mit der Ausnahme, dass die statischen Klassen ermöglichen es dem Compiler die Entwickler zu erzwingen Intent (nicht diese Klasse instanziieren, bequeme Syntax für seine Funktionalität Zugriff auf etc ).

Wie Sie sagen, eine starke Verbreitung von „Helper“ Klassen können Sie in Schwierigkeiten geraten (Design, Wartbarkeit, Lesbarkeit, Auffindbarkeit, andere-Fähigkeiten ...). Kein Argument hier. Aber kann man argumentieren, dass eine „Helfer“ -Klasse ist nie angemessen? Ich bezweifle es.

Tatsächlich kann verantwortungsvoller Einsatz von statischen Klassen haben große Vorteile für Ihren Code:

  • Die Enumerable statische Klasse bietet eine Reihe von Erweiterungsmethoden der meisten von uns gekommen sind, zu lieben. Sie sind eine logische Reihe von Funktionen / Business-Logik, die nicht eine Instanz eines bestimmten Typs in Zusammenhang steht.
  • Dienstleistungen von der Umwelt / Kontext zur Verfügung gestellt: zB Logging, Konfiguration (manchmal)
  • Andere (die ich zur Zeit nicht denken kann:))

Also nein, im Allgemeinen ist es nicht schlecht Praxis. verwenden sie nur mit Bedacht ...

Andere Tipps

Bedeutet es, „Verwendung von statischen Klassen ist falsch“ (in diesem Fall der Artikel falsch ist) oder „Statische Klassen oft in schlecht geschriebenen Code gefunden werden“ (in diesem Fall ist es sagt nicht, dass statische Klassen in sich schlecht sind, sondern dass sie manchmal verwendet werden, falsch)

Statische Funktionen sind effizienter als nicht-statisch, weil diese nicht in eine Instanz eines Objekt erstellen müssen verwenden oder einen ‚diesen‘ Zeiger in Methodenaufrufe übergeben.

Die Verwendung von statischen Klassen globale Variablen zu halten, ist eine andere Sache - in diesem Fall die zugrunde liegende Regel nicht, dass „Statik ist schlecht“, sondern „Globals sind schlecht“

.

Ich denke, das allgemeine Argument gegen wandelbaren Zustand in statischen Klassen zu halten, und im Grunde sie als globale Variablen. Es ist nichts falsch mit statischen Hilfsmethoden in einer statischen Klasse.

Und, warum globale Variablen sind schlecht, ich bin sicher, dass zwischen hier und Google Sie eine halbe Millionen Seiten und Blog-Posts über sie finden.

Nein, es ist nicht wirklich korrekt ist.

Es gibt viele Funktionen, die nicht spezifisch auf eine Instanz eines Objekts sind, und dass erfordern keinen Staat. Zum Beispiel 'Math' Funktionen betrachten.

Fast alle Sprachen haben so etwas wie:

y = Math.round(x);

So ist die ‚runde‘ Funktion ist statisch. Sie könnten, wenn Sie verrückt waren, argumentieren für so etwas wie (C #):

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

Aber IMHO, werden Sie ein wenig seltsam sein, dies zu tun.

Sicherlich gibt es eine Zeit, wenn zu viele statische Funktionen ein Zeichen für etwas schief gegangen sind, aber innerhalb Grund ist es nicht ‚schlecht‘.

Hier sind einige Links zu einigen Google Test Blog-Posts auf, warum statische Methoden, um die Testbarkeit des Codes verletzen kann, als auch, warum statische Methoden (das ist die schlechte Teil der statischen Klassen sind) einzuführen alle Arten von potentiell überraschend Kopplung und Interaktion zwischen den Komponenten.

wie etwa oo denken

Singletons

static-Methoden-sind- Tod-to-Testbarkeit

Es gibt Bedürfnisse, wo Sie eine Utility-Klasse, wo alle Methoden statisch sind. In diesem Fall, wenn Sie machen die Klasse statische es Ihre Absicht deutlich anzeigt. Und zumindest in C # können Sie nicht nicht-statische Methoden innerhalb einer statischen Klasse.

Ich verwende statische Utility-Klassen die ganze Zeit in meinem Code für Methoden, die oft genannt werden, aber ein Schmerz zu instanziieren wäre. Ein Beispiel wäre eine einfache Protokollierung Klasse wie:

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

Nun, in keine Weise kann ich jemals diese Klassen und Methoden speichern jede Art von globalem Zustand habe, da dies zu großen concurrancy Fragen und im Allgemeinen führen können nur schlechtes Design.

So vermeide nicht statische Klassen, nur vermeiden, diese statischen Klassen eine Art globalen Zustand halten zu müssen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top