Wenn die Funktion "rein" ist, sehe ich keine Probleme. Eine reine Funktion arbeitet nur in den Eingabeparametern und liefert darauf basierend ein Ergebnis. Es hängt nicht von einem globalen Zustand oder einem externen Kontext ab.
Wenn ich mir Ihr eigenes Codebeispiel ansehe:
public class Class1
{
public static string GetSomeString()
{
// do something
}
}
Diese Funktion akzeptiert keine Parameter. Daher ist es wahrscheinlich nicht rein (die einzige reine Implementierung dieser Funktion wäre die Rückgabe einer Konstanten). Ich gehe davon aus, dass dieses Beispiel nicht repräsentativ für Ihr eigentliches Problem ist. Ich weise lediglich darauf hin, dass dies wahrscheinlich keine reine Funktion ist.
Nehmen wir ein anderes Beispiel:
public static bool IsOdd(int number) { return (number % 2) == 1; }
Es ist nichts Falsches daran, dass diese Funktion statisch ist. Wir könnten dies sogar zu einer Erweiterungsfunktion machen, damit der Client-Code noch besser lesbar wird. Erweiterungsfunktionen sind im Grunde nur eine spezielle Art von statischen Funktionen.
Telastyn erwähnt die Parallelität korrekt als potenzielles Problem mit statischen Mitgliedern. Da diese Funktion jedoch keinen gemeinsam genutzten Status verwendet, treten hier keine Parallelitätsprobleme auf. Tausend Threads können diese Funktion gleichzeitig ohne Parallelitätsprobleme aufrufen.
Im .NET Framework gibt es seit geraumer Zeit Erweiterungsmethoden. LINQ enthält viele Erweiterungsfunktionen (z. B. Enumerable.Where () , Enumerable.First () , Enumerable.Single () usw.). Wir sehen das nicht als schlecht an, oder?
Unit-Tests können häufig von Vorteil sein, wenn der Code austauschbare Abstraktionen verwendet, sodass der Unit-Test den Systemcode durch ein Test-Double ersetzen kann. Statische Funktionen verbieten diese Flexibilität, dies ist jedoch vor allem an den Grenzen der Architekturschicht wichtig, wo wir beispielsweise eine tatsächliche Datenzugriffsschicht durch eine gefälschte Datenzugriffsschicht ersetzen möchten .
Wenn wir jedoch einen Test für ein Objekt schreiben, das sich anders verhält, je nachdem, ob eine Zahl ungerade oder gerade ist, müssen wir die Funktion nicht wirklich IsOdd()
durch eine alternative Implementierung ersetzen können . Ebenso sehe ich nicht, wann wir zum Enumerable.Where()
Testen eine andere Implementierung bereitstellen müssen .
Untersuchen wir also die Lesbarkeit des Client-Codes für diese Funktion:
Option a (mit der als Erweiterungsmethode deklarierten Funktion):
public void Execute(int number) {
if (number.IsOdd())
// Do something
}
Option b:
public void Execute(int number) {
var helper = new NumberHelper();
if (helper.IsOdd(number))
// Do something
}
Die statische (Erweiterungs-) Funktion macht den ersten Code besser lesbar, und die Lesbarkeit ist sehr wichtig. Verwenden Sie daher gegebenenfalls statische Funktionen.