Verletzen private statische Methoden in C # irgendetwas?

10

Ich habe eine private Validierungsmethode für eine bestimmte Validierung erstellt, die in meiner Klasse mehrmals durchgeführt wird (ich kann die validierten Daten aus verschiedenen Gründen nicht speichern). ReSharper schlägt nun vor, die Funktion statisch zu machen. Ich bin etwas zurückhaltend, da bekannte Probleme mit statischen Methoden bekannt sind. Es wäre eine private statische Methode. Meine Frage ist, können private statische Methoden ähnliche Kopplungs- und Testprobleme verursachen wie öffentliche statische Methoden? Ist es eine schlechte Praxis? Ich würde nicht raten, aber ich bin mir nicht sicher, ob es hier eine Falle gibt.

Tamás Szelei
quelle
10
Was sind die "bekannten Probleme" mit statischen Methoden?
Robert Harvey
3
@ Ed: Richtig. Ordnungsgemäß geschriebene statische Methoden sollten ohnehin keine externen APIs oder Zustände berühren. Das Manipulieren des in einer Klasse eingekapselten internen Zustands scheint mir vollkommen in Ordnung zu sein, und die Methode müsste nicht einem Unit-Test unterzogen werden, da Unit-Tests das externe Verhalten der Klasse testen.
Robert Harvey
1
Statische Methoden neigen dazu, den globalen Status zu ändern, und sie beenden auch die Vererbung (jedes Mal, wenn Sie die Funktionalität erweitern möchten, müssen Sie den aufrufenden Code ändern, da Sie die Methode in einer abgeleiteten Klasse nicht überschreiben können). Sie sind an diese eine Implementierung gebunden. Statische Methoden können nicht verspottet werden, was es sehr schwierig macht, sie in Einheiten zu testen. Sie verbergen die Abhängigkeit . Ich bin sicher, es gibt noch mehr. Um sie nicht nur blind zu meiden, bitte ich um eine fundierte Entscheidung.
Tamás Szelei
2
@ Tamás Statische Methoden ändern den globalen Status nur, wenn Sie sie so schreiben, was ich nie tue. Im Allgemeinen verwende ich statische Methoden nur in Utility-Klassen, Methoden, die ein oder mehrere Objekte verwenden und ein Objekt ohne Nebenwirkungen zurückgeben. Diese Arten von Methoden haben keines der von Ihnen beschriebenen Probleme.
Robert Harvey
1
@ TamásSzelei Wie neigen sie dazu, den globalen Zustand zu ändern? Sie können nicht einmal den globalen Status finden, wenn Sie ihn nicht an einen Parameter übergeben.
CodesInChaos

Antworten:

16

Ich würde denken: "Muss ich das testen?"

Wenn Ihre Methode sowieso privat ist, was bedeutet, dass Sie die Logik in der Methode selbst nicht einem Komponententest unterziehen möchten, ist Ihre Klasse in Bezug auf Testbarkeit und Wartbarkeit in beiden Fällen eine Black Box. Das Innenleben Ihrer Klasse ist ihre Aufgabe und es ist allein. Das Refactoring wird ebenfalls nicht beeinflusst, was ebenfalls zu berücksichtigen ist.

Also meiner Meinung nach: Nein, eine "private" Methode "privat statisch" zu machen, hat keinerlei langfristige Auswirkungen.

Ed James
quelle
17

Private statische Methoden sind aus meiner Sicht am einfachsten.

DataIn -> Methode -> DataOut

Es gibt keine Abhängigkeiten von externen Objekten, keine Nebenwirkungen. Warum hältst du sie für schlecht?

Codierer
quelle
Vielen Dank. Ich habe meine Bedenken in den Kommentaren unter der Frage erklärt.
Tamás Szelei
2
Was Sie beschreiben, ist nur für statische Methoden korrekt, die nicht von statischen Elementvariablen abhängen. Dies kann einen Unterschied zwischen einer "guten" und einer "schlechten" statischen Methode ausmachen.
Doc Brown
2

Das Testen von Klassen, die öffentliche statische Methoden verwenden, kann schwierig sein, da es (besonders) nicht einfach ist, die statischen Methoden zu stub / fälschen / verspotten. Instanzmethoden hingegen können leicht verspottet werden, insbesondere wenn sie virtuell sind oder eine Schnittstelle erfüllen.

Ich sehe jedoch keinen Grund, keine privaten statischen Methoden zu verwenden. In der Tat gibt es einen leichten Leistungsvorteil, da Sie keine Instanz der Klasse benötigen, um Speicher zu belegen.

Auf der anderen Seite ist alles, was statisch ist, ein bisschen nach Code. Ist das eigentlich eine "Helferklasse"? Könnte es sein, dass sich die Methode sinnvoller in einer der als Parameter übergebenen Klassen befindet? Die Antwort auf diese Fragen lautet oft "es ist in Ordnung als Statik", aber es lohnt sich, sich daran zu erinnern.

Jeremy McGee
quelle
Die Klasse, die die statische Methode enthält, belegt ohnehin bereits Speicher. Ihre Angst vor dem staticSchlüsselwort scheint unbegründet.
Robert Harvey