Se la funzione è "pura" non vedo problemi. Una funzione pura opera solo nei parametri di input e fornisce un risultato basato su quello. Non dipende da alcuno stato globale o contesto esterno.
Se guardo il tuo esempio di codice:
public class Class1
{
public static string GetSomeString()
{
// do something
}
}
Questa funzione non accetta alcun parametro. Pertanto, probabilmente non è puro (l'unica implementazione pura di questa funzione sarebbe quella di restituire una costante). Presumo che questo esempio non sia rappresentativo del tuo problema reale, sto semplicemente sottolineando che questa probabilmente non è una funzione pura.
Facciamo un esempio diverso:
public static bool IsOdd(int number) { return (number % 2) == 1; }
Non c'è nulla di sbagliato nel fatto che questa funzione sia statica. Potremmo persino trasformarlo in una funzione di estensione, consentendo al codice client di diventare ancora più leggibile. Le funzioni di estensione sono fondamentalmente solo un tipo speciale di funzioni statiche.
Telastyn menziona correttamente la concorrenza come un potenziale problema con i membri statici. Tuttavia, poiché questa funzione non utilizza lo stato condiviso, non ci sono problemi di concorrenza qui. Mille thread possono chiamare questa funzione contemporaneamente senza problemi di concorrenza.
Nel framework .NET, i metodi di estensione esistono da un po 'di tempo. LINQ contiene molte funzioni di estensione (ad es. Enumerable.Where () , Enumerable.First () , Enumerable.Single () , ecc.). Non li vediamo male, vero?
I test unitari possono spesso trarre vantaggio quando il codice utilizza astrazioni sostituibili, consentendo al test unitario di sostituire il codice di sistema con un doppio di test. Le funzioni statiche vietano questa flessibilità, ma ciò è per lo più importante ai confini del livello architettonico, dove vogliamo sostituire, ad esempio, un livello di accesso ai dati effettivo con un livello di accesso ai dati falso .
Tuttavia, quando si scrive un test per un oggetto che si comporta in modo diverso, a seconda che un numero sia pari o dispari, non è necessario poter sostituire la IsOdd()
funzione con un'implementazione alternativa. Allo stesso modo, non vedo quando dobbiamo fornire Enumerable.Where()
un'implementazione diversa ai fini del test.
Esaminiamo quindi la leggibilità del codice client per questa funzione:
Opzione a (con la funzione dichiarata come metodo di estensione):
public void Execute(int number) {
if (number.IsOdd())
// Do something
}
Opzione b:
public void Execute(int number) {
var helper = new NumberHelper();
if (helper.IsOdd(number))
// Do something
}
La funzione statica (estensione) rende il primo pezzo di codice molto più leggibile e la leggibilità è molto importante, quindi usa le funzioni statiche dove appropriato.