Tipps zum Vermeiden der Überlastung durch statische Methoden

8

Ich überarbeite etwas Code und schaue mir eine Klasse namens HFile an. HFile hat alle privaten Konstruktoren, so dass Sie keine Instanzen davon erstellen können. Anstatt Instanzen von HFiles wie folgt zu erstellen:

%Vor%

Alle HFile-Interaktionen werden über statische Methoden abgewickelt. Wenn ich also eine Datei speichern möchte, rufe ich an:

%Vor%

und dann wird intern eine Instanz von HFile erstellt und dann gespeichert. Natürlich muss jeder Leser, ohne die ganze Geschichte zu kennen, sein Urteilsvermögen zurückhalten, aber es scheint, dass die Verwendung von statischen Methoden an meinem Arbeitsplatz sehr in Mode gekommen ist. Ich frage mich also, ob es gute Prinzipien / Best Practices für die Verwendung von statischen Methoden gibt, die für eine Gruppe von Leuten hilfreich sein können, die sich setzen und ihre Verwendung von statischen Methoden überprüfen.

    
Daniel 29.01.2010, 22:20
quelle

6 Antworten

5

Wenn Ihre Situation eine Verkapselung des Status oder einer Organisationsstruktur erfordert, verwenden Sie im Allgemeinen Klassen.

Auf der anderen Seite, wenn Sie etwas haben, das eine Querschnittsaufgabe darstellt und in Ihrer gesamten Anwendung breit angewendet werden kann, können Sie Methoden in einer statischen Dienstprogrammklasse in Erwägung ziehen. System.Math im .NET-Framework (und Java) ist ein Beispiel dafür.

In Ihrem Beispiel ist HFile wahrscheinlich ein Objekt mit Status, daher würde ich normalerweise keine statische Methode verwenden, um es zu speichern. Es ist einfacher, einen Methodenaufruf für das spezifische HFile-Objekt auszuführen, anstatt das gesamte Objekt an eine statische Speichermethode übergeben zu müssen. Ob das in Ihrer speziellen Anwendung sinnvoll ist oder nicht, hängt davon ab, ob das Anwendungsparadigma HFile-Objekte als Dinge sieht, die von externen Methoden weitergegeben oder bearbeitet werden, oder als eigenständige Objekte, die sich selbst speichern können.

    
Robert Harvey 29.01.2010, 22:23
quelle
10

Viele statische Methoden / statische Klassen sind ein Symptom von proceduralitis - prozeduraler Code in einer objektorientierten Sprache schreiben. Der beste Weg, um diese Art von Denken zu beseitigen, ist ein gründliches Verständnis objektorientierter Prinzipien und Praktiken. Die Verwendung von testgetriebener Entwicklung und das Erzwingen von testfähigem Code wird helfen, da es viel schwieriger ist, Tests für statische Klassen zu schreiben. Schließlich, wenn Sie TDD verwenden, tendieren Sie natürlich zu mehr entkoppelten, OO-Architekturen, wenn auch nur um den Testschmerz zu lindern.

    
tvanfosson 29.01.2010 22:27
quelle
5

Statische Methoden sind schwer zu testen, weil Sie sie nicht ausspionieren können. Aus diesem Grund neigen wir dazu, sie an meinem Arbeitsplatz zu meiden. Obwohl wir sie für Fabrikmethoden verwenden.

    
Alex Baranosky 29.01.2010 22:24
quelle
3

Ich würde mich nicht so sehr über die Anzahl der statischen Methoden Gedanken machen, als über diese Methoden. Eine statische Methode, die einen Wert zurückgibt oder ein Objekt ändert, das Sie als Argument übergeben? Keine große Sache. Eine statische Methode, die private statische Felder ändert? Ich bin besorgt. Eine statische Methode, die öffentliche statische Felder anderer Klassen ändert? Ich muss mich in einen abgedunkelten Raum mit einem feuchten Waschlappen auf meiner Stirn legen.

    
Robert Rossney 29.01.2010 23:10
quelle
2

Das ist nicht sehr objektorientiert, oder? Nun, vielleicht mag dein Platz den OO-Code nicht wirklich, und das ist in Ordnung. Wenn Sie jedoch Daten und Methoden einkapseln möchten, benötigen Sie Instanzmethoden, um mit diesen Daten zu arbeiten.

Eine Fülle von statischen Methoden ist wahrscheinlich mit vielen globalen Variablen verbunden. Z.B. Die Informationen, die Sie in den Dateinamen speichern möchten, müssen global sein, wenn Sie eine statische HFile.save ('Dateiname') aufrufen. Generell versuchen wir, Globals zu reduzieren, um die Dinge überschaubarer zu halten.

Aber wenn Sie prozeduralen Code schreiben wollen, dann ist es in Ordnung.

    
John 29.01.2010 22:25
quelle
2

IMO statische Methoden sind nicht nützlich für den Zweck, den Sie beschrieben haben, ist an Ihrem Arbeitsplatz üblich. Nachteile dieser Methode:
- Was ist der Zweck, ein Objekt zu erstellen, das eine Datei darstellt, um nur eine Methode aufzurufen?
- kann Interface-basierten Polymorphismus nicht verwenden

Um Ihre Frage zu beantworten, hier sind einige Fälle, wo ich eine statische Methode verwenden würde:
- Eine Hilfsmethode, die etwas mit der Funktionalität der Klasse, aber nicht mit einem Objekt zu tun hat. Vielleicht braucht es ein Array von Objekten und vergleicht sie. Vielleicht macht es einige generische Datenmanipulation (Konvertierungen, etc.).
- wo Sie klassenbezogene Sachen mit Klassenvariablen erledigen müssen - wo Sie ein Singleton-Entwurfsmuster implementieren möchten

    
abc 29.01.2010 22:29
quelle