Ana içeriğe geç

Saf fonksiyon

İngilizcesi
Pure Function
Okunuşu
pyur fankşın

Günlük kullanımda iki ad da yaygın.

Güncellendi 2 dk okuma

Bu sayfayı paylaşın

Bağlantıyı gönderin, tanımı bağlantısıyla birlikte alıntılayın ya da kendi sitenizde bir kart olarak gösterin.

https://softwaredictionary.org/tr/terimler/pure-function

Kısaca

Saf fonksiyon, aynı girdi için her zaman aynı çıktıyı döndüren ve yan etkisi olmayan, yani kendi dışındaki hiçbir şeyi değiştirmeyen fonksiyondur.

Saf fonksiyon (pure function) nedir?

Saf bir fonksiyon iki kurala uyar. Birincisi, sonucu yalnızca argümanlarına bağlıdır: aynı girdilerle binlerce kez çağırın, her seferinde aynı yanıtı alırsınız. İkincisi, yan etkisi yoktur; yani dışarıdaki değişkenleri değiştirmez, argümanlarını değiştirmez, dosyalara ya da veritabanlarına yazmaz, ekrana yazdırmaz ve ağ çağrıları yapmaz.

Bir fonksiyon, gizli bir durumu okuduğu veya değiştirdiği anda saf olmaktan çıkar. Math.random() ve geçerli saati okuyan bir fonksiyon, sonuçları çağrılar arasında değiştiği için saf değildir; argüman olarak aktarılan bir diziye öğe ekleyen bir fonksiyon da çağıranın sahip olduğu veriyi değiştirdiği için saf değildir. Saf fonksiyonlar referans şeffafıdır (referentially transparent): herhangi bir çağrı, programın davranışını değiştirmeden sonucuyla değiştirilebilir; bu, sonuçları önbelleğe almayı, yani memoization olarak bilinen tekniği güvenli kılar.

Bir hesap makinesinin karekök düğmesi iyi bir benzetmedir: 16 için basıldığında her zaman 4 gösterir ve hesap makinesinde saklanan başka hiçbir şeyi değiştirmez. Saf fonksiyonların birim testini yapmak kolaydır, çünkü yalnızca girdileri ve çıktıları denetlemeniz yeter; ayrıca paralel çalıştırılmaları güvenlidir. Fonksiyonel programlamanın merkezindedirler ve günlük kodda reducer'lar, biçimlendirme yardımcıları ve hesaplama mantığı olarak görünürler.

Saf fonksiyonlar bazen idempotent işlemlerle karıştırılır. Bir kullanıcının e-postasını sabit bir değere ayarlamak gibi idempotent bir işlem, bir kez ya da birçok kez çalışsın aynı nihai sonucu verir, ancak saklanan veriyi değiştirdiği için yine de bir yan etkisi vardır. Gerçek programların yan etkilere ihtiyacı vardır; bu yüzden olağan yaklaşım, çekirdek mantığı saf tutmak ve veritabanı yazma gibi işleri programın kenarlarına itmektir.

Önemli noktalar

  • Saf fonksiyon, aynı girdi için her seferinde aynı çıktıyı döndürür.
  • Yan etkisi yoktur: dış duruma, argümanlara, dosyalara veya ağa hiçbir değişiklik yapmaz.
  • Saf fonksiyonları test etmek, önbelleğe almak ve paralel çalıştırmak kolaydır.
  • İdempotent işlemlerin yine de yan etkileri olabilir; bu yüzden otomatik olarak saf değildirler.

Örnek

Saf bir fonksiyon ile saf olmayan bir fonksiyon yan yanajavascript
// Pure: depends only on its inputs and changes nothing else
function addTax(price, rate) {
  return price * (1 + rate);
}

// Impure: reads and changes state outside the function
let total = 0;
function addToTotal(price) {
  total += price;      // side effect: changes outside state
  console.log(total);  // side effect: output
  return total;
}

Sık sorulan sorular

`console.log` bir yan etki midir?

Evet. Konsola, bir dosyaya ya da ağa yazmak fonksiyonun dışındaki bir şeyi değiştirir; bu yüzden log yazan bir fonksiyon, dönüş değeri öngörülebilir olsa bile teknik olarak saf değildir.

Saf bir fonksiyon başka bir fonksiyonu çağırabilir mi?

Evet, çağırdığı fonksiyonlar da saf olduğu sürece. Geçerli saati okuyan gibi saf olmayan bir fonksiyonu çağırmak, çağıranı da saf olmaktan çıkarır.

Saf fonksiyonları test etmek neden daha kolaydır?

Çıktıları yalnızca girdilerine bağlı olduğu için bir test fonksiyonu bazı argümanlarla çağırıp sonucu denetler. Önceden kurulması gereken global durum, veritabanı ya da mock yoktur.

İlgili sayfalar

Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin

Daha fazla

Ayarlar