Eğer fonksiyon "saf" ise hiçbir problem görmüyorum. Saf bir işlev yalnızca giriş parametrelerinde çalışır ve buna dayalı bir sonuç sağlar. Herhangi bir küresel duruma veya dış bağlama bağlı değildir.
Kendi kod örneğinize bakarsam:
public class Class1
{
public static string GetSomeString()
{
// do something
}
}
Bu işlev herhangi bir parametre almaz. Bu nedenle, muhtemelen saf değildir (bu işlevin tek saf uygulaması sabit döndürmek olacaktır). Bu örneğin gerçek probleminizi temsil etmediğini varsayıyorum, sadece bunun muhtemelen saf bir işlev olmadığını belirtiyorum.
Farklı bir örnek verelim:
public static bool IsOdd(int number) { return (number % 2) == 1; }
Bu fonksiyonun statik olmasıyla ilgili yanlış bir şey yoktur. Bunu bir uzantı fonksiyonuna dönüştürerek istemci kodunun daha da okunabilir olmasını sağlayabiliriz. Uzatma fonksiyonları vardır temelde statik işlevleri sadece özel bir tür.
Telastin, statik üyelerde potansiyel bir sorun olarak eşzamanlılıktan doğru bir şekilde bahseder. Ancak, bu işlev paylaşılan durumu kullanmadığından, burada eşzamanlılık sorunu yoktur. Bin iş parçacığı eşzamanlılık sorunu olmadan aynı anda bu işlevi çağırabilir.
.NET çerçevesinde, uzantı yöntemleri oldukça uzun bir süredir varlığını sürdürmektedir. LINQ çok sayıda uzantı işlevi içerir (örneğin Enumerable.Where () , Enumerable.First () , Enumerable.Single () , vb.). Bunları kötü görmüyoruz, değil mi?
Birim testi genellikle kod değiştirilebilir soyutlamalar kullandığında yarar sağlayabilir ve birim testinin sistem kodunu bir test çiftiyle değiştirmesine izin verir. Statik işlevler bu esnekliği yasaklar, ancak bu çoğunlukla gerçek veri erişim katmanını sahte veri erişim katmanıyla değiştirmek istediğimiz mimari katman sınırlarında önemlidir .
Bununla birlikte, farklı davranan bir nesne için bir test yazarken, bir sayının tek veya çift olmasına bağlı olarak, IsOdd()
işlevi gerçekten alternatif bir uygulama ile değiştirmemiz gerekmez . Benzer şekilde, Enumerable.Where()
test amacıyla ne zaman farklı bir uygulama sağlamamız gerektiğini görmüyorum .
Şimdi bu işlev için istemci kodunun okunabilirliğini inceleyelim:
Seçenek a (işlev bir uzantı yöntemi olarak bildirilmiş olarak):
public void Execute(int number) {
if (number.IsOdd())
// Do something
}
Seçenek b:
public void Execute(int number) {
var helper = new NumberHelper();
if (helper.IsOdd(number))
// Do something
}
Statik (uzatma) işlevi, ilk kod parçasını daha okunaklı hale getirir ve okunabilirlik çok önemlidir, bu nedenle uygun olduğunda statik işlevleri kullanın.