Bunun yararı, saf işlevlerin kodunuzun akıl yürütmesini kolaylaştırmasıdır. Veya başka bir deyişle, yan etkiler kodunuzun karmaşıklığını artırır.
Bir computeProductPrice
yöntem örneği alın .
Saf bir yöntem sizden ürün miktarı, para birimi vb. İster. Yöntem aynı argümanlarla çağrıldığında her zaman aynı sonucu üreteceğini bilirsiniz .
- Hatta önbelleğe alabilir ve önbelleğe alınmış sürümü kullanabilirsiniz.
- Tembel yapabilir ve gerçekten ihtiyaç duyduğunuzda çağrısını erteleyebilirsiniz, değerin bu arada değişmeyeceğini bilerek.
- Yan etkileri olmayacağını bilerek yöntemi birden çok kez çağırabilirsiniz.
- İhtiyaç duyulan her şeyin argüman olduğunu bilerek, yöntemin kendisini dünyadan soyutlanarak akıl edebilirsiniz.
Saf olmayan bir yöntemin kullanımı ve hata ayıklaması daha karmaşık olacaktır. Değişkenler dışındaki değişkenlerin durumuna bağlı olduğu ve muhtemelen değiştirildiği için, birden çok kez çağrıldığında farklı sonuçlar üretebileceği veya hiç çağrılmadığında veya çok erken veya çok geç çağrıldığında aynı davranışa sahip olamayacağı anlamına gelir.
Misal
Çerçevede bir sayıyı ayrıştıran bir yöntem olduğunu düşünün:
decimal math.parse(string t)
Referans şeffaflığı yoktur, çünkü şunlara bağlıdır:
Numaralandırma sistemini belirten ortam değişkeni, yani Taban 10 veya başka bir şey.
math
Kitaplık içindeki, ayrıştırılacak sayıların kesinliğini belirten değişken . Yani değeri ile 1
, dizeyi ayrıştırmak "12.3456"
verir 12.3
.
Beklenen biçimlendirmeyi tanımlayan kültür. Örneğin fr-FR
, ayrıştırma "12.345"
verir 12345
, çünkü ayırma karakteri olmamalıdır ,
,.
Böyle bir yöntemle çalışmanın ne kadar kolay veya zor olacağını düşünün. Aynı girişle, yöntemi çağırdığınız ana bağlı olarak radikal olarak farklı sonuçlara sahip olabilirsiniz, çünkü bir şey, bir yerde ortam değişkenini değiştirdi veya kültürü değiştirdi veya farklı bir hassasiyet ayarladı. Yöntemin deterministik olmayan karakteri daha fazla hataya ve daha fazla hata ayıklamaya neden olan kabusa yol açar. Bazı paralel kod sekizlik sayıları ayrıştırdığı için çağrı yapmak math.parse("12345")
ve 5349
cevap almak hoş değildir.
Açıkçası kırık olan bu yöntem nasıl düzeltilir? Referans şeffaflığı getirerek. Başka bir deyişle, küresel durumdan kurtulup her şeyi yöntemin parametrelerine taşıyarak:
decimal math.parse(string t, base=10, precision=20, culture=cultures.en_us)
Şimdi yöntem saf olduğuna göre, yöntemi çağırdığın önemli değil, her zaman aynı argümanlar için aynı sonucu üreteceğini biliyorsun.