Saf Fonksiyon Nedir
Yan Etki, Immutable Veri ve Temiz Kod İlişkisi Nasıl Anlaşılmalıdır
"İyi kodun sessiz gücü, ne kadar karmaşık iş yaptığıyla değil; aynı işi ne kadar az belirsizlikle yapabildiğiyle anlaşılır."
— Ersan Karavelioğlu
Saf fonksiyon, fonksiyonel programlamanın en temel yapı taşlarından biridir. En basit tanımıyla saf fonksiyon şu iki özelliğe sahip fonksiyondur:
- Aynı girdi verilirse her zaman aynı çıktıyı üretir.
- Dış dünyada hiçbir yan etki oluşturmaz.
Yani bir fonksiyon gerçekten safsa, sadece kendisine verilen veriyi işler ve sonucunu döndürür. Dışarıda bir şeyi gizlice değiştirmez.
Saf Fonksiyon Nedir
Saf fonksiyonun mantığı çok nettir:
Girdi alır, işler, çıktı verir.
Mesela şöyle bir fonksiyon düşün:
def topla(a, b):
return a + b
Bu saf fonksiyondur.
Çünkü:
topla(2, 3) her zaman 5 döndürür.
topla(10, 1) her zaman 11 döndürür.
Ayrıca bu fonksiyon dışarıdaki hiçbir şeyi değiştirmez.
Saf Fonksiyon Neden Önemlidir
Saf fonksiyon önemlidir çünkü kodu daha:
- öngörülebilir
- test edilebilir
- okunabilir
- güvenli
hâle getirir.
Bir fonksiyonun ne yaptığını anlamak için sadece parametrelerine bakabiliyorsan, o fonksiyonu anlamak çok daha kolay olur.
Aynı Girdi Aynı Çıktı Ne Demektir
Bir fonksiyonun sonucu dış etkilere bağlı değilse, bu ilke sağlanır.
Mesela şu örnek saf değildir:
import random
def rastgele_sayi():
return random.randint(1, 10)
Bu fonksiyon parametre almıyor ama her çağrıda farklı sonuç verebilir.
Bu yüzden saf değildir.
Saf fonksiyonda sürpriz olmaz.
Sonuç her zaman girdiye bağlıdır.
Yan Etki Nedir
Yan etki, fonksiyonun sadece çıktı döndürmekten fazlasını yapmasıdır.
Örnek yan etkiler:
- ekrana yazı yazmak
- dosyaya veri kaydetmek
- veritabanına yazmak
- global değişken değiştirmek
- dışarıdaki listeyi değiştirmek
- internet isteği göndermek
Mesela şu fonksiyon yan etki içerir:
def selam_ver():
print("Merhaba")
Bu fonksiyon ekrana yazı bastığı için yan etkili bir fonksiyondur.
Yan etki her zaman kötü değildir. Ama iş mantığının içine fazla yayılırsa kod karmaşıklaşır.
Saf Olmayan Fonksiyon Örneği
Şöyle düşün:
sayac = 0
def arttir():
global sayac
sayac = sayac + 1
return sayac
Bu saf değildir.
Çünkü dışarıdaki sayac değişkenini değiştiriyor.
Yani fonksiyon sadece sonuç döndürmüyor, sistemin durumunu da değiştiriyor.
Immutable Veri Nedir
Immutable veri, oluşturulduktan sonra yerinde değiştirilmemeye çalışılan veridir.
Mesela şu yaklaşım mutable yani değiştirilebilir yapıdadır:
liste = [1, 2, 3]
liste.append(4)
Burada eski liste değişti.
Fonksiyonel yaklaşıma daha yakın olan kullanım ise şöyledir:
liste = [1, 2, 3]
yeni_liste = liste + [4]
Burada eski liste korunur, yeni liste üretilir.
İşte immutable düşünce budur:
Veriyi bozma, yeni veri üret.
Immutable Yaklaşım Neden Faydalıdır
Çünkü veri yerinde değiştiğinde hata takibi zorlaşır.
İnsan şu soruları sormaya başlar:
- Bu veri nerede değişti

- Kim değiştirdi

- Ne zaman değişti

- Başka hangi kod bundan etkilendi

Ama eski veri korunursa, takip daha kolay olur.
Bu yüzden immutable yaklaşım büyük projelerde çok değerlidir.
Saf Fonksiyon ile Immutable Veri Arasındaki İlişki Nedir
Saf fonksiyon, mümkün olduğunca girdiyi bozmadan çalışmak ister.
Immutable veri de zaten bunu destekler.
Yani:
- saf fonksiyon veriyle sessizce oynamaz
- immutable yaklaşım veriyi yerinde bozmaz
Bu ikisi birlikte kullanıldığında kod daha temiz olur.
Temiz Kod ile Bağlantısı Nedir
Temiz kod demek sadece kısa kod demek değildir.
Temiz kod demek:
- ne yaptığı belli olan
- sürpriz üretmeyen
- okununca anlaşılabilen
- test edilmesi kolay olan
kod demektir.
Saf fonksiyonlar bu temizliği destekler. Çünkü fonksiyonun davranışı nettir.
Mesela şöyle bir fonksiyon çok daha temizdir:
def kdv_ekle(fiyat):
return fiyat * 1.20
Bu fonksiyon çok açık çalışır.
Ne aldığını ve ne verdiğini hemen anlarsın.
Saf Fonksiyon Test Yazımını Neden Kolaylaştırır
Çünkü saf fonksiyonun davranışı sabittir.
Mesela:
def kare(x):
return x * x
Bunu test etmek çok kolaydır:
kare(2) sonucu 4 olmalı
kare(5) sonucu 25 olmalı
kare(0) sonucu 0 olmalı
Dış bağlantı yok, gizli durum yok, sürpriz yok.
Ama içinde dosya okuyan, saat kullanan, dış değişken değiştiren fonksiyonları test etmek çok daha zordur.

Yan Etkiyi Tamamen Yok Etmek mi Gerekir
Hayır. Gerçek uygulamalarda yan etki gerekir.
Mesela:
- kullanıcıya sonuç göstermek
- dosya kaydetmek
- veri çekmek
- veri yazmak
bunlar gereklidir.
Doğru yaklaşım şudur:
İş mantığını mümkün olduğunca saf yaz.
Yan etkileri ayrı katmanda tut.
Yani önce hesapla, sonra gerekirse dış dünyaya yaz.

Kötü ve Daha Temiz Mantık Arasındaki Fark
Daha karışık yaklaşım:
Bir fonksiyon hem hesap yapıyor, hem ekrana yazıyor, hem global değişken değiştiriyor.
Daha temiz yaklaşım:
Bir fonksiyon sadece hesap yapıyor.
Ayrı bir yerde sonuç ekrana yazdırılıyor.
Bu ayrım çok önemlidir. Çünkü kod parçaları görevlerine göre ayrılmış olur.

Günlük Hayattan Basit Bir Örnek
Diyelim bir ürün fiyatına KDV ekleyeceksin.
Temiz ve saf mantık:
def kdv_ekle(fiyat):
return fiyat * 1.20
Sonra başka yerde:
sonuc = kdv_ekle(100)
ekrana_yaz(sonuc)
Burada hesap ayrı, dış dünya işi ayrı.
Bu çok daha düzenli yapıdır.

Saf Fonksiyon Yazmak İçin Nelere Dikkat Etmelisin
Şunlara dikkat et:
- Fonksiyon parametre ile çalışsın
- Sonuç return ile dönsün
- Global değişken kullanmasın
- Dışarıdaki veriyi değiştirmesin
- İçinde print, dosya yazma, ağ isteği gibi işlemler olmasın
- Aynı veriyle her zaman aynı sonucu üretsin
Bu kurallara ne kadar yaklaşırsan, fonksiyonların o kadar temiz olur.

Hangi Tür Fonksiyonlar Genelde Saf Yazılabilir
Özellikle şunlar çok uygundur:
- hesaplama işlemleri
- veri dönüştürme işlemleri
- filtreleme işlemleri
- formatlama işlemleri
- iş kuralları
- validasyon kontrolleri
Mesela:
- fiyat hesaplama
- indirim uygulama
- metni büyük harfe çevirme
- listedeki çift sayıları seçme
bunlar çok rahat saf yazılabilir.

Saf Olmayan Ama Gerekli Fonksiyonlar Hangileridir
Şunlar çoğu zaman yan etkilidir:
- ekrana çıktı verme
- dosya okuma / yazma
- veritabanı işlemleri
- API çağrıları
- sistem saati kullanma
- kullanıcıdan input alma
Bunlar gereksiz değildir.
Sadece bunları çekirdek mantıktan ayırmak daha sağlıklıdır.

En Büyük Karışıklık Nerede Olur
En büyük karışıklık, saf olmayan fonksiyonu saf gibi düşünmekten gelir.
Mesela fonksiyonun görünüşte basit olabilir ama içeride:
- global veri değiştiriyordur
- listeyi yerinde bozuyordur
- dışarıdan bir bilgiye sessizce bağımlıdır
- zamanı kullanıyordur
İşte bunlar görünmeyen karmaşa üretir.

Kısa Özet Mantığı
Saf fonksiyon = temiz hesap makinesi gibi çalışır.
Yan etki = dışarıyı değiştirir.
Immutable veri = mevcut veriyi bozmak yerine yenisini üretir.
Temiz kod = davranışı açık, güvenilir ve izlenebilir kod demektir.
Bu dördü birlikte düşünüldüğünde çok güçlü bir yazılım temeli oluşur.

Son Söz
Saf fonksiyon, yan etkiyi azaltma ve immutable veri yaklaşımı birlikte düşünüldüğünde, kod çok daha sağlam bir yapıya kavuşur. Çünkü yazılımda büyük sorunların önemli kısmı, algoritmanın zor olmasından değil; kimin neyi, nerede, sessizce değiştirdiğinin bilinmemesinden çıkar.
Saf fonksiyon sana şunu kazandırır:
Netlik.
Yan etkiyi sınırlamak şunu kazandırır:
Kontrol.
Immutable düşünce şunu kazandırır:
İzlenebilirlik.
Bunların birleşimi ise temiz kodu doğurur.
“Kodun gerçekten temiz olduğu an, yalnız çalıştığı an değil; neden çalıştığının da berrak biçimde görülebildiği andır.”
— Ersan Karavelioğlu