2010-05-07 22 views
22

Aşağıdaki yöntem Saf mı? Öyle diyorum ki, şu anki sınıfta değişmediği için, şimdi, bu metodu çalıştırmadan önce sınıfta "görebiliyoruz" diye kestirebileceğimiz her şey, sonradan tam olarak aynı olacaktır. Doğrumuyum? Eğer System.Diagnostics.Contracts den Pure özniteliği ile etiketlenmiş demek [Pure] tarafından ise[Pure] yöntemleri hakkında soru

class Set { 
    ... 
    public ISet<T> UnionWith(ISet<T> set) { 
     ISet<T> unionSet = ... 

     foreach (Element element in this) { 
      unionSet.Add(element); 
     } 

     foreach (Element element in set) { 
      unionSet.Add(element); 
     } 

     return unionSet; 
    } 
} 
+0

Belki de * idempotent * terimini mi arıyorsunuz? –

+0

Hmmm ... gerçekten değil. –

+0

Bir fonksiyonun saf olup olmadığını düşünürken, soyutlama düzeyinizi dikkate almak (kavramsal olarak) önemlidir. Bu gerçekten nesnel nesnelliktir, çünkü herhangi bir mevcut nesnenin (yeni olanın dışında) durumunu değiştirmez, fakat sistem açısından tam bir şey değildir - hafızayı ayırır, böylece sistemin durumunu değiştirir. – Kos

cevap

31

, dokümantasyon diyor ki:

Saf yöntemler gözle görülür devlet değişiklik yapmayın. senin yöntem görünür bir hal değişiklikleri (yani hiçbir yan etkisi) yapamaz görünüyor beri

, bu [Pure] öznitelik için hak olur.

+1

Yöntemin uygun olmadığı herhangi bir "saf" tanımı var mı? Görebildiğim kadarıyla, matematiksel olarak da saftır - her zaman aynı girdiyi (aynı zamanda girdi olarak sayılır) verilen aynı çıktıyı üretecek ve genel sistemin durumunu herhangi bir şekilde değiştirmeyecektir. –

+1

Pavel: "Saf" nın bazı tanımları, girişlerin değişmez olmasını gerektirir. Saf ise bir giriş fonksiyonunu hafızaya alan bir sarmalayıcı işlevini düşünün. Set, bunu bilen sarıcı olmadan değişebilirse, UnionWith'in bir sarıcı ile not almak için "yeterince saf" olmadığını söyleyebilirdiniz. – Gabe

+0

Şu anda C# 's Kod Sözleşmelerinden farklı bir saf tanım kullanarak, bazı soruların cevap vermediğini belirttim. Ancak yazarı daha sonra sildi. Buradaki fikir şuydu ki, eğer farklı zamanlarda, aynı ISet 'umu sınıfıma geçirirseniz, sınıfımın öğeleri farklı zamanlarda farklı olabileceğinden, farklı çıktılar elde edersiniz, bu yüzden işleviniz saf değildir. http://en.wikipedia.org/wiki/Pure_function –