‫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 işlevi aynı girdiyle milyonlarca kez çalıştırırsam, aynı çıktıyla sonuçlanmalıdır.
‫İ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 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.