2009-09-19 5 views
8

Ich habe kürzlich festgestellt, dass Resharper, wenn ich private Methoden erstelle, die einige Felder in den Objekten setzen, die an sie übergeben werden, einen Hinweis anzeigt, dass die Methode statisch gemacht werden kann.Ist Resharpers Empfehlung, meine private Methode statisch zu machen, eine gute Empfehlung?

Hier ist ein stark vereinfachtes Beispiel für die Art von Methode, die ich haben könnte.

private void MakeStatusTheSame(MyClass mc, MySecondClass msc) 
{ 
    mc.Status = msc.Status; 
} 

Wenn ich eine Methode wie diese habe, gibt Resharper eine Empfehlung, dass die Methode statisch gemacht werden kann.

Ich versuche zu vermeiden, öffentliche Methoden statisch zu machen, da sie Chaos auf Unit-Tests zerstören ... aber ich bin mir nicht sicher, dass das gleiche für private Methoden gilt.

Ist die Empfehlung von Resharper eine gültige Best Practice oder sollte ich sie einfach abschalten?

+2

Öffentliche Methoden sind vollständig testbar, * wenn sie keine Nebenwirkungen verursachen. * –

Antwort

11

Ich denke, das ist definitiv ein idealer Kandidat für eine statische Methode. Es ist nicht der Klasse des Eigenschaften zu verändern, Felder etc.

Hier ein Beispiel:

class MyClass 
{ 
    public static void MakeStatusTheSame(MyClass mc, MySecondClass msc) 
    { 
    mc.status = msc.status; 
    } 

    private void MakeStatusTheSame(MySecondClass msc) 
    { 
    this.status = msc.status; 
    } 

    private int status; 
} 
Auch

, können Sie es eine Erweiterungsmethode machen (die auch statisch sein würde):

public static class Extensions 
{ 
    public static MyClass MakeStatusTheSame(this MyClass mc, MySecondClass msc) 
    { 
    mc.status = msc.status 
    return mc; /* make the method chainable */ 
    } 
} 
7

Ich denke schon; zu sehen, dass eine Methode statisch ist, ist ein klarer Hinweis darauf, dass die Methode mit allen Instanzenmembern interagieren soll.

Stellen Sie sich vor, Sie würden eine nicht statische Methode debuggen und feststellen, dass die Instanz nicht berührt wird. Sofortiger Geruch, und wenn es keinen Kommentar gibt, der erklärt, was die Funktion tut, könnten Sie vom wirklichen Problem abgelenkt werden.

+2

+1, um deutlich zu machen, dass die Methode nicht mit Instanzenmembern interagieren soll. Ich möchte definitiv, dass die Leute zweimal überlegen, bevor sie diesen bestimmten Code mit Methodenaufrufen für Instanzmitglieder ändern. Wenn Sie die private Methode statisch markieren, wenn jemand den Code für die Verwendung eines Instanzmitglieds geändert hat, erhalten sie eine Kompilierungswarnung, die sie zumindest für einige Sekunden zum Nachdenken bringen sollte. – mezoid

+0

Ich hatte R # empfehlen, eine Methode vor wenigen Minuten nur statisch zu machen, nur um einen Kompilierfehler zu finden, der versucht, auf ein Instanzfeld zuzugreifen. Das erste Mal, dass es passiert ist, etwas muss es verwirrt haben. – ProfK

+0

Was meinst du mit Interaktion? Werte ändern? Oder beinhaltet das Lesen von Werten? – guiomie

4

Ich gehe normalerweise mit R # Empfehlung. Es ist eine private Methode, also schreiben Sie (hoffentlich) keine Komponententests dagegen. Wenn Sie es statisch machen, wird explizit angegeben, dass es keine Instanzelemente verwendet, wodurch die Überprüfung auf Nebenwirkungen erleichtert wird.

8

Auf die Gefahr, wie ein Contrarian klingen, muss ich zugeben, dass ich statische Methoden nicht gerne mit Instanzmethoden mischen; und ich mag statische Methoden im Allgemeinen nicht. Statische Methoden sind schwer zu testen, schwer zu überschreiben und schwer zu warten. Ich bevorzuge es, alle statischen Methoden für den Umgang mit Foo-Objekten in einer einzigen FooUtils-Klasse zu verankern - oder noch besser in einer Singleton-Instanz einer FooSomethingDoer-Klasse.

Natürlich sind statische Methoden in einigen Fällen sinnvoll - zum Beispiel beim Erstellen der oben erwähnten Singletons oder Fabriken usw. Ich sage nicht, dass alle statischen Methoden aus reinem Bösen bestehen; Ich mag es lieber, auf der Seite zu bleiben, wenn es möglich ist.

+0

Ich bin bei dir. Ich mache Methoden nur dann statisch, wenn es Sinn macht, nicht nur weil ich "kann". – Josh

+1

Ich würde für öffentliche, geschützte und interne stimmen - aber nicht für private Methoden. Es gibt eine Diskussion im Netz, wenn Utils Klassen ein Code-Geruch sind; Ich würde vorschlagen, sie vorsichtig zu verwenden. – TrueWill

+0

Einverstanden. Die Methode static ist ein Versuch, Informationen zur Verwendung dieser Methode zu kommunizieren. Alles statisch machen macht keinen Sinn. –