Angemessene Verwendung der statischen Methode

7

Vom Konzept her ist es angemessen, eine statische Methode (C #) zu verwenden, wenn die Methode nur Eingaben benötigt und die Eingabe als Ausgabe formatiert? Zum Beispiel:

%Vor%

Wenn ich ein paar dieser Arten von Methoden hätte, wäre eine statische "Utility" -Klasse eine gute Idee?

    
JayWD 10.02.2011, 23:31
quelle

10 Antworten

3

Ich würde den anderen Antworten soweit zustimmen, dass es sicherlich sehr viel Sinn macht.

Manchmal möchten Sie vielleicht etwas flexibler sein, indem Sie eine Schnittstelle definieren und diese mit Instanzmethoden implementieren. Dies gibt Ihnen die Möglichkeit, verschiedene Methoden in Ihrem Code zu verwenden.

Hier ist ein Beispiel dafür, was ich meine. Angenommen, Sie verwenden diese formatString -Methode in einem Code, der wie folgt aussieht:

%Vor%

OK, das ist großartig. (Eigentlich ist es dumm, aber was auch immer - nur zur Veranschaulichung!) Aber Sie könnten eine solche Methode flexibler machen, indem Sie eine Schnittstelle akzeptieren, von der Sie verschiedene Implementierungen haben, die völlig verschiedene Arten von bieten Formatierung:

%Vor%

Dann wäre% ce_de% eine statische Hilfsklasse, es wäre also nur eine eine Implementierung einer Klasse, die eine Möglichkeit bietet, einen bestimmten Objekttyp zu formatieren (in Ihrem Fall StringUtils ). Objekte, in meinem Beispiel, diese imaginären string Objekte).

Also das ist alles eine sehr langatmige Art zu sagen, es kommt darauf an. Wenn Sie nach Superflexibilität streben, vielleicht sollten Sie überlegen, eine Schnittstelle zu implementieren, statt mit einer statischen Hilfsklasse zu arbeiten.

Beachten Sie, dass in meinem obigen Beispiel eine andere völlig akzeptable Methode zur Lösung des Problems darin bestehen könnte, anstelle dieser hypothetischen DataField -Schnittstelle einen Delegierten Func<T, string> zu akzeptieren. Dies ist meiner Meinung nach eine stilistische Entscheidung. Häufig werden Schnittstellen jedoch realistischer, wenn mehrere Verhaltensweisen angepasst werden sollen. d. h., das Definieren von Methoden, die 3, 4 oder mehr Delegierte akzeptieren, kann im Vergleich zur Annahme einer einzelnen Schnittstelle schnell umständlich werden.

    
Dan Tao 10.02.2011, 23:44
quelle
3

Ja, wenn Sie mehrere statische Methoden haben, die allgemein verwandt sind, ist es eine gute Idee, sie in einer statischen Dienstprogrammklasse zusammenzustellen.

Wenn Sie über Konvention sprechen, ist es auch erwähnenswert, dass Namenskonventionen in den meisten .NET-Codes für Pascal-verkürzte öffentliche Member (also FormatString anstelle von formatString ) und camel-cased Parameter und Felder (z inputString anstelle von InputString ).

    
Adam Robinson 10.02.2011 23:34
quelle
2

Wenn Sie diese öffentlich machen, dann ist es möglicherweise besser, eine Dienstprogrammklasse zu erstellen.

Wenn ich das gesagt habe, würde ich versuchen, es so "allgemein" wie möglich zu machen, da sie ansonsten schnell unwartbar werden.

    
Reed Copsey 10.02.2011 23:34
quelle
2

Ja, die statischen Methoden in der Art, wie Sie sie in C # verwenden, sind der Idee von C ++ von "freien Funktionen" sehr ähnlich. Es passiert einfach, dass C # keine freien Funktionen hat. Eric Lippert hat hier irgendwo einen interessanten Beitrag, warum das so ist. Eine statische Klasse wird zum Gruppieren von Funktionen mit ähnlichem Nutzen verwendet und wäre geeignet, wenn Sie mehrere davon hätten, die ähnlich sind.

    
Steve 10.02.2011 23:34
quelle
2

Ja, das ist in Ordnung, Ihre Klasse wird dann als eine 'Bibliothek' verwandter Funktionen fungieren. Ihre andere Wahl wäre, entweder den globalen Namespace mit verschiedenen Funktionen zu verschmutzen oder einen Singleton zu erstellen, der unnötig wäre, da kein "Zustand" dafür verantwortlich ist ...

    
biril 10.02.2011 23:34
quelle
2

Ja, das könntest du tun. Oder Sie könnten eine String-Extension-Methode erstellen.

msdn-Erweiterungsmethoden

Für das obige Beispiel würde ich den String-Formatierer anstelle der Inline-Verkettung verwenden.

%Vor%     
Arron S 10.02.2011 23:37
quelle
2

Wenn diese spezielle Formatierung an mehr als einer Stelle in Ihrem Code nützlich wäre.

Wenn es nur innerhalb einer bestimmten Klasse sinnvoll wäre, würde ich lieber eine private Methode verwenden (statisch oder Instanz, es würde keinen Unterschied machen).

Utility-Klassen sind eine nützliche Sache. Das einzige, worauf Sie achten sollten, ist, sie nicht zu oft zu benutzen. Wenn der Großteil Ihres Codes in Utility-Klassen enthalten ist, machen Sie etwas falsch. Aber einen gemeinsamen Code in Hilfsmethoden herauszufiltern, ist eine vollkommen gerechtfertigte Verwendung.

    
Goran Jovic 10.02.2011 23:37
quelle
2

Sie können dafür eine Erweiterungsmethode verwenden, um die String-Klasse zu erweitern. Es würde den Rufcode ein wenig ordentlicher machen, aber am Ende ist es nur eine Frage des persönlichen Geschmacks.

%Vor%     
John Hoge 10.02.2011 23:41
quelle
2

Meiner Meinung nach lautet die Antwort ja, dass Sie diese Methoden in eine Utility-Klasse (Util) stellen würden. Auf einer webbasierten Java-Anwendung, an der ich gerade arbeite, haben wir tatsächlich drei solche Util-Klassen, von denen jede nur statische Methoden enthält, die denen, die Sie gezeigt haben, entsprechen. Der Grund, warum wir 3 haben, ist eine für den Client nur Util-Methoden, eine nur für Server und eine dritte für gemeinsame Util-Methoden.

Je nachdem, was Ihre App ist, können Sie etwas ähnliches haben.

Nebenbei: Wenn Sie mehr darüber erfahren möchten, wann statische Klassen in C # verwendet werden sollen, werfen Sie einen Blick auf hier .

Ich hoffe, dass Ihre Frage ausreichend beantwortet hat.

    
brent777 10.02.2011 23:45
quelle
1

Ich würde mich eher auf die Verwendung einer Erweiterungsmethode stützen, die immer noch statisch ist;)

%Vor%     
Jonathan 10.02.2011 23:37
quelle

Tags und Links