wake-up-neo.com

Sind globale statische Klassen und Methoden schlecht?

Es besteht allgemein Einigkeit darüber, dass eine starke Abhängigkeit von globalen Themen vermieden werden sollte. Wäre es nicht dasselbe, statische Klassen und Methoden zu verwenden?

28
Adam Kane

Globale Daten sind schlecht. Durch die Arbeit mit statischen Methoden können jedoch viele Probleme vermieden werden.

Ich werde die Position von Rich Hickey dazu einnehmen und es so erklären:

Verwenden Sie zum Erstellen der zuverlässigsten Systeme in C # statische Methoden und Klassen, jedoch keine globalen Daten. Wenn Sie beispielsweise ein Datenobjekt in eine statische Methode einreichen und diese statische Methode nicht auf statische Daten zugreift, können Sie sicher sein, dass die Ausgabe der Funktion bei diesen Eingabedaten immer dieselbe ist. Dies ist die Position, die Erlang, LISP, Clojure und jede andere Funktionale Programmiersprache einnehmen.

Die Verwendung statischer Methoden kann die Multithread-Codierung erheblich vereinfachen, da bei korrekter Programmierung immer nur ein Thread auf einen bestimmten Datensatz zugreifen kann. Und darauf kommt es wirklich an. Globale Daten zu haben ist schlecht, da es sich um einen Zustand handelt, der jederzeit von jedem geändert werden kann, der welchen Thread kennt. Statische Methoden ermöglichen jedoch sehr sauberen Code, der in kleineren Schritten getestet werden kann.

Ich weiß, dass dies heiß diskutiert werden wird, da es angesichts des Denkprozesses von C #OOP im Umlauf ist, aber ich habe festgestellt, dass mein Code umso sauberer und zuverlässiger ist, je statischer meine Methoden sind.

Dieses Video erklärt es besser als ich, zeigt aber, wie unveränderliche Daten und statische Methoden extrem thread-sicheren Code erzeugen können.


Lassen Sie mich einige Probleme mit Global Data etwas näher erläutern. Konstante (oder schreibgeschützte) globale Daten sind bei weitem kein so großes Problem wie veränderbare (Lese-/Schreib-) globale Daten. Verwenden Sie globale Daten, wenn ein globaler Datencache sinnvoll ist! In gewissem Maße hat jede Anwendung, die eine Datenbank verwendet, dies, da wir sagen können, dass alle SQL-Datenbanken eine massive globale Variable sind, die Daten enthält.

Eine pauschale Aussage, wie ich sie oben gemacht habe, ist wahrscheinlich ein bisschen stark. Nehmen wir stattdessen an, dass mit globalen Daten viele Probleme verbunden sind, die durch lokale Daten vermieden werden können.

Einige Sprachen wie Erlang umgehen dieses Problem, indem der Cache in einem separaten Thread gespeichert wird, der alle Anforderungen für diese Daten verarbeitet. Auf diese Weise wissen Sie, dass alle Anforderungen und Änderungen an diesen Daten atomar sind und der globale Cache nicht in einem unbekannten Zustand verbleibt.

43

static bedeutet nicht unbedingt global. Klassen und Mitglieder können static private sein und gelten daher nur für die bestimmte Klasse. Das heißt, zu viele public static-Mitglieder zu haben, anstatt geeignete Methoden zur Datenübermittlung (Methodenaufrufe, Rückrufe usw.) zu verwenden, ist im Allgemeinen ein schlechtes Design.

9
Janick Bernet

Wenn Sie versuchen, in Bezug auf Ihre OO -Entwicklung puristisch zu sein, passt die Statik wahrscheinlich nicht in die Form.

Die reale Welt ist jedoch chaotischer als die Theorie, und Statik ist oft ein sehr nützlicher Weg, um einige Entwicklungsprobleme zu lösen. Verwenden Sie sie nach Bedarf und in Maßen.

6
Andrew Anderson

Veränderbare statische Variablen sind schlecht, weil sie nur ein globaler Zustand sind. Die beste Diskussion darüber, die ich kenne, ist hier unter der Überschrift "Warum globale Variablen vermieden werden sollten, wenn sie nicht erforderlich sind" .

Statische Methoden weisen einige Nachteile auf, die sie häufig unerwünscht machen. Der größte Nachteil ist, dass sie nicht polymorph verwendet werden können.

3
Jeff Sternal

Zusätzlich zu allem, was gesagt wird, sind final static -Variablen in Ordnung. Konstanten sind eine gute Sache. Die einzige Ausnahme ist, wenn/wenn Sie sie nur in eine Eigenschaftendatei verschieben sollten, um die Änderung zu vereinfachen.

2
Dean J

Erstens, warum sind die alten globalen Variablen so schlecht? Weil es ein Zustand ist, der von überall und zu jeder Zeit zugänglich ist. Schwer zu verfolgen.

Es gibt keine derartigen Probleme mit statischen Methoden .

Das lässt statische Felder (Variablen). Wenn Sie ein public static-Feld in einer Klasse deklarieren, wäre dies wirklich eine globale Variable, und es wäre schlecht.

Aber machen Sie das statische Feld privat und die meisten Probleme sind gelöst. Oder besser, sie sind auf die enthaltende Klasse beschränkt, und das macht sie lösbar.

2
Henk Holterman
public class Foo
{
    private static int counter = 0;

    public static int getCounterValue()
    {
         return counter;
    }
    //...
    public Foo()
    {
        //other tasks
        counter++;
    }
}

Im obigen Code können Sie sehen, dass wir zählen, wie viele Foo-Objekte erstellt wurden. Dies kann in vielen Fällen hilfreich sein.

Das statische Schlüsselwort ist nicht global. Es weist darauf hin, dass es sich auf Klassenebene befindet, was in verschiedenen Fällen sehr nützlich sein kann. Zusammenfassend sind Dinge auf Klassenebene statisch, Dinge auf Objektebene nicht statisch.

2
Lajos Arpad

Statische Methoden werden verwendet, um Merkmale in Scala zu implementieren. In C # erfüllen statische Erweiterungsmethoden diese Rolle in part . Dies könnte, wie die DCI-Befürworter behaupten, als "Form des Polymorphismus höherer Ordnung" angesehen werden.

Es können auch statische Methoden zum Implementieren von Funktionen verwendet werden. Dies ist, was F # verwendet, um Module zu implementieren. (Und auch VB.NET .) Funktionen sind für die (nicht überraschende) Funktionsprogrammierung nützlich. Und manchmal sind sie genau so, wie etwas modelliert werden sollte (wie die "Funktionen" in der Klasse Math ). Auch hier kommt C # nahe hier.

2
Jordão

Ich denke, das Schlechte an globalen Variablen ist die Idee eines globalen Zustands - Variablen, die überall manipuliert werden können und dazu neigen, in weit entfernten Bereichen eines Programms unbeabsichtigte Nebenwirkungen zu verursachen.

Statisch data würde globalen Variablen insofern ähneln, als sie eine Art globalen Zustand einführen. Statische Methoden sind jedoch nicht annähernd so schlecht, vorausgesetzt, sie sind zustandslos.

1
Eric Petroelje

Nicht komplett. Statisch bestimmt tatsächlich, wann, wo und wie oft etwas instanziiert wird, nicht wer Zugriff darauf hat.

0
GalacticCowboy