Saf fonksiyon nedir?
Saf bir fonksiyon şuna benzer.
Bir işlevimiz var.
Dolayısıyla, daha önce sahip olduğumuz tüm bu işlevlerin nesnelerinden oluşan bir kutu yerine, bunu sadece basit bir
işlev olarak düşünün.
Ve diyelim ki ona bir, iki ve üç içeren bir liste verdik.
Bu girdiyi bu fonksiyona verirsek, saf bir fonksiyondan beklediğimiz şey, bu girdiye her seferinde
aynı şeyle sonuçlanacak bir şey olmasıdır.
Diyelim ki bunu iki ile çarptık, iki, dört ve altı elde ederiz.
Şimdi saf bir fonksiyonun iki kuralı vardır.
Birincisi, aynı girdi verildiğinde, her zaman aynı çıktıyı döndürmesidir.
Yani, bu listeye her bir, iki ve üç verdiğimizde, bunu oluşturduğumuz bir fonksiyona veriyoruz.
Her zaman aynı çıktıyı döndürmelidir.
Yani bu fonksiyonu aynı girdiyle milyonlarca kez çalıştırırsam, aynı çıktıyı vermesi gerekir.
İkinci nokta ise bu fonksiyon fikrinin herhangi bir yan etki üretmemesi gerektiğidir.
Yan etkiler nelerdir?
Yan etkiler, bir işlevin yaptığı ve dış dünyayı etkileyen şeylerdir.
Örneğin, bu işlevin içinde bir şey yazdırırsam, bu dış dünyayı etkiler, değil mi?
Çünkü ekrana bir şey basıyorum.
Ekran dış dünyadır.
Ya da örneğin, bu işlev farklı bir kapsam dışında yaşayan bir değişkene dokunuyorsa, bu
bir yan etkidir.
Bu kavramı biraz daha anlamak için koda bir göz atalım.
Diyelim ki bir fonksiyonumuz var ve bu fonksiyon çarpma işlemi yapacak.
Bir listeye göre.
O yüzden sadece bir müttefik diyelim, listemiz bu olacak.
Ve burada, yapmak istediğimiz şey öğe üzerinde döngü oluşturmak.
Listede.
Ve sonra çarpmak ve yeni bir listeye eklemek istediğimiz her öğe.
Bu yüzden boş bir liste olacak yeni bir liste oluşturalım.
Ve burada yeni liste, nokta ekleme diyeceğiz.
Ve maddeyi iki ile çarpın.
Ve son olarak, bu fonksiyonun sonunda yeni listeyi döndürmek istiyoruz.
Bir deneyelim.
Eğer iki ile çarp dersem ve bir, iki, üç verirsem, çıktısını alalım.
İşte çıktı.
Çalıştır'a tıklarsam.
Altıya iki mi alacağım?
Bu saf bir işlev mi?
Bunu bir düşünelim.
İlk kural, aynı girdi verildiğinde, yani bir, iki ve üç.
Her zaman aynı çıktıyı döndürecektir.
Bunu kaç kez çalıştırırsam çalıştırayım, bana hep aynı çıktıyı verecek.
Böylece ilk testi geçtik.
Peki ya ikinci test?
Hiçbir yan etkisi yoktur.
Bunun herhangi bir yan etkisi var mı?
Bu dış dünyadaki herhangi bir şeye dokunuyor mu?
Bunu bir düşün.
Hayır, öyle değil.
Doğru.
Dış dünyadaki hiçbir şey bu işlev için önemli değildir.
Çünkü her şey burada yer alıyor.
Örneğin, burada yazdırmak yerine, sadece yazdırırsak.
Ve burada.
Çalıştır'a tıklarsam.
Aynı çıktıyı alıyoruz.
Peki bunun yan etkileri var mı?
Evet, öyle.
Print deyimi olan dış dünya ile etkileşime girer.
print deyimi bana, hey, bu makinenin ekranında ne varsa ona yazdıracağım diyor.
Bizim durumumuzda, buraya yazdıracak, ancak print deyiminin ne yaptığını gerçekten bilmiyoruz
çünkü bu taraftaki ekranla etkileşime giriyor.
Yani bu.
Yan etkileri vardır.
Kontrolü baskıya veriyoruz ama baskının ne yapacağını bilmiyoruz.
Size verebileceğim bir başka örnek.
Burada aslında dışarıda tanımladığımız yeni bir liste varsa bu ne?
Bu şekilde.
Böylece bu şekilde yeni bir listemiz olacak.
Çalıştır'a tıklarsam.
Hala altıda iki alıyorum.
Peki bunun yan etkileri var mı?
Evet, öyle.
Dış dünya ile etkileşim halindedir.
Ve bu fonksiyon dünyasının dışında ne var, unutmayın, kapsam budur.
Bu yeni listeyle etkileşime giriyor.
Bu yeni listeye açılır.
Yani bir programcı gelirse ve belki de bu işlevi çalıştırmadan önce yeni liste demeye karar verirsek.
Boş bir dizeyle değiştiriyoruz.
Bu fonksiyonu çalıştırdığımda.
Artık bu yeni liste bir dize nesnesi olduğu için bir hata alıyorum.
Dolayısıyla, bu işlevin dış dünyasında yaşayan yeni liste başka bir geliştirici veya bir program tarafından değiştirilebilir
ve bizim bundan haberimiz olur.
Ve bu fonksiyonu çalıştırdığımızda, bize bir hata verecektir.
Bir yan etkisi var.
Yani ideal olarak fonksiyonlarımızı içeriyoruz.
Ve onları saf hale getirin çünkü gördüğünüz gibi, burada yanlış bir şey yazmadığımız sürece kodumuzda asla bir hata
ya da bug olmayacaktır.
Ama dış dünya umurumuzda olmadığı için, girdi olarak verdiğimiz her şey her zaman
iyi bir çıktı üreteceği için, saf olacaktır.
Şimdi, işyerinde biraz deneyim sahibi olmadan bunun neden bu kadar güçlü bir kavram olduğunu gerçekten anlamak
zor.
Ama size şunu söyleyeyim, saf fonksiyonlara sahip olduğunuzda.
Daha az hatalı kodunuz olur, kodunuzu daha iyi test edebilirsiniz.
Kodunuzu ve genel olarak anlamak daha kolaydır.
Kodunuzun farklı bölümlerinin birbirine dokunmaması ve birbirini etkilememesi gibi avantajlara sahip
olursunuz, bu da bir programcı olarak hayatınızı çok daha kolaylaştırır.
Dolayısıyla bu saf fonksiyonlar fikri gerçekten önemlidir.
Ancak bundan çıkarmanızı istediğim tek şey, saf işlevlerin mutlak olmaktan çok bir kılavuz
olduğudur.
Her yerde saf fonksiyonlara sahip olmak imkansızdır, çünkü bir fonksiyon dış dünyayı hiç etkilemiyorsa,
herhangi bir programımız da olmazdı.
Bir şeyleri sergileyemeyiz.
Oyun profilimiz gibi şeyleri kaydedemeyiz.
Bu yüzden her yerde saf fonksiyonlara sahip olmak imkansızdır.
Ancak, yapabildiğiniz zaman, yapabildiğiniz her yerde, fonksiyonel programlama bize fonksiyonlarınızın iyi olduğunu öğretir.
Saf fonksiyonlar oluşturmaya çalışın ve kodumuzda hata olduğunda geri dönebileceğimiz, dış dünya ile etkileşime
girebilecek birkaç saf olmayan fonksiyona sahip olun.
Çünkü büyük olasılıkla bu tür işlevlerde hatalar olacaktır.
Fonksiyonel programlama kavramımızı sonlandırmak için.
Örneğin, bu bizim fonksiyonel programlama ile ilgili önceki videolardaki sihirbazımız olsaydı, bir
sihirbaz nesnemiz olurdu.
Ya da adı olan Büyücü Sözlüğü.
Merlin diyelim.
Ve güç.
50.
Ve bunları bir sınıfta tutmak yerine, saldırı gibi farklı yöntemlere sahip olurdum.
Ve bu bir yöntem olmaz.
Bu bir fonksiyon olacaktır çünkü bir sınıfın içinde yer almaz.
İşlevsel programlamada.
Diyorlar ki, Hey, verileri fonksiyonlarla birleştirmemize gerek yok, bunları ayrı tutalım.
Sadece aktarılabilen saf fonksiyonlar oluşturalım.
Karakter gibi bir şey.
Ve bu şekilde bu iki şeyi ayrı tutuyoruz, böylece saf fonksiyonlara odaklanabiliyoruz ve verilere odaklanabiliyoruz.
İşte fark burada.
Günün sonunda, her şey kodumuzu temiz tutmaya çalışmak ve kodumuzdaki hatalardan kaçınmakla ilgilidir.
Programcıların her zaman yaşadığı büyük bir sorun.
Yani bu sadece farklı bir düşünme biçimi.
Bir sonraki videoda biraz daha öğrenelim.