Saf fonksiyon
- İngilizcesi
- Pure Function
- Okunuşu
- pyur fankşın
Günlük kullanımda iki ad da yaygın.
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
// 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
- FonksiyonProgramlamanın Temelleri, s. 20Fonksiyon, belirli bir işi yapan, isteğe bağlı olarak parametre denen girdiler alıp sonuç döndürebilen, adlandırılmış ve yeniden kullanılabilir kod bloğudur.
- Fonksiyonel programlamaProgramlamanın Temelleri, s. 21Fonksiyonel programlama, paylaşılan verileri değiştirmeyen saf fonksiyonlarla yazılım kurma stilidir; kodu daha öngörülebilir ve test etmesi kolay yapar.
- DeğişmezlikProgramlamanın Temelleri, s. 11Değişmezlik, bir değerin oluşturulduktan sonra değiştirilememesi demektir; her güncelleme, orijinali yerinde değiştirmek yerine yeni bir değer üretir.
- MemoizationProgramlamanın Temelleri, s. 37Memoization, fonksiyon çağrılarının sonuçlarını saklayıp aynı girdiler tekrar geldiğinde kaydedilen sonucu döndüren bir optimizasyon tekniğidir.
- IdempotencyBackend ve API'ler, s. 23Idempotency, bir işlemin bir kez de çalışsa çok kez de çalışsa aynı sonucu üretmesi özelliğidir; böylece bir isteğin yanlışlıkla tekrarlanması güvenli olur.
- Birim TestiTest ve Kalite, s. 4Birim testi, bir fonksiyonun, metodun ya da sınıfın programın geri kalanından yalıtılmış olarak doğru davrandığını doğrulayan küçük ve otomatik bir kontroldür.
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin