Se la funzione è "pura", non vedo problemi. Una funzione pura opera solo nei parametri di input e fornisce un risultato basato su di esso. Non dipende da nessuno stato globale o contesto esterno.
Se guardo il tuo esempio di codice:
public class Class1
{
public static string GetSomeString()
{
// do something
}
}
Questa funzione non richiede alcun parametro. Quindi, 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 solo sottolineando che probabilmente non è una funzione pura.
Prendiamo un esempio diverso:
public static bool IsOdd(int number) { return (number % 2) == 1; }
Non c'è niente di sbagliato in questa funzione che è 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. Un migliaio di thread può chiamare questa funzione contemporaneamente senza problemi di concorrenza.
Nel framework .NET, i metodi di estensione esistono già da un po 'di tempo. LINQ contiene molte funzioni di estensione (ad esempio Enumerable.Where () , Enumerable.First () , Enumerable.Single () , ecc.). Non li vediamo così male, vero?
I test unitari possono spesso avvantaggiare quando il codice utilizza astrazioni sostituibili, consentendo al test dell'unità di sostituire il codice di sistema con un doppio di prova. Le funzioni statiche vietano questa flessibilità, ma questo è per lo più importante ai confini del livello architettonico, dove vogliamo sostituire, ad esempio, un effettivo livello di accesso ai dati con un falso livello di accesso ai dati .
Tuttavia, quando si scrive un test per un oggetto che si comporta in modo diverso, a seconda che qualche numero sia pari o dispari, non è necessario essere in grado di sostituire la funzione IsOdd()
con un'implementazione alternativa. Allo stesso modo, non vedo quando è necessario fornire un'implementazione Enumerable.Where()
diversa ai fini del testing.
Quindi esaminiamo 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à conta molto, quindi usa le funzioni statiche dove opportuno.