Jika fungsinya "murni" saya tidak melihat masalah. Fungsi murni hanya beroperasi di parameter input, dan memberikan hasil berdasarkan itu. Itu tidak tergantung pada negara global atau konteks eksternal.
Jika saya melihat contoh kode Anda sendiri:
public class Class1
{
public static string GetSomeString()
{
// do something
}
}
Fungsi ini tidak mengambil parameter apa pun. Jadi, itu mungkin tidak murni (satu-satunya implementasi murni dari fungsi ini adalah mengembalikan konstanta). Saya berasumsi bahwa contoh ini tidak mewakili masalah Anda yang sebenarnya, saya hanya menunjukkan bahwa ini mungkin bukan fungsi murni.
Mari kita ambil contoh berbeda:
public static bool IsOdd(int number) { return (number % 2) == 1; }
Tidak ada yang salah dengan fungsi ini statis. Kami bahkan bisa menjadikan ini sebagai fungsi ekstensi, yang memungkinkan kode klien menjadi lebih mudah dibaca. Fungsi ekstensi yang pada dasarnya hanya jenis khusus dari fungsi statis.
Telastyn dengan benar menyebutkan concurrency sebagai potensi masalah dengan anggota statis. Namun, karena fungsi ini tidak menggunakan status bersama, tidak ada masalah konkurensi di sini. Seribu utas dapat memanggil fungsi ini secara bersamaan tanpa ada masalah konkurensi.
Dalam kerangka NET., Metode ekstensi telah ada selama beberapa waktu. LINQ berisi banyak fungsi ekstensi (mis. Enumerable.Where () , Enumerable.First () , Enumerable.Single () , dll.). Kami tidak melihat ini sebagai buruk, kan?
Pengujian unit sering mendapat manfaat ketika kode menggunakan abstraksi yang dapat diganti, memungkinkan pengujian unit untuk mengganti kode sistem dengan uji ganda. Fungsi statis melarang fleksibilitas ini, tetapi ini terutama penting pada batas-batas lapisan arsitektur, di mana kami ingin mengganti, misalnya, lapisan akses data aktual dengan lapisan akses data palsu .
Namun, ketika menulis tes untuk objek yang berperilaku berbeda, tergantung pada apakah beberapa angka ganjil atau genap, kita tidak benar-benar perlu untuk dapat mengganti IsOdd()
fungsi dengan implementasi alternatif. Demikian juga, saya tidak melihat kapan kita perlu memberikan Enumerable.Where()
implementasi yang berbeda untuk tujuan pengujian.
Jadi mari kita periksa keterbacaan kode klien untuk fungsi ini:
Opsi a (dengan fungsi yang dinyatakan sebagai metode ekstensi):
public void Execute(int number) {
if (number.IsOdd())
// Do something
}
Opsi b:
public void Execute(int number) {
var helper = new NumberHelper();
if (helper.IsOdd(number))
// Do something
}
Fungsi statis (ekstensi) membuat potongan kode pertama jauh lebih mudah dibaca, dan keterbacaan sangat penting, jadi gunakan fungsi statis yang sesuai.