Java Fonksiyonel Programlama – Giriş
Bu yazının amacı, fonksiyonel programlamayı derinlemesine öğrenmek değil java programlamaya fonksiyonel programlama prensipleri nasıl implemente edilmiştir oraya doğru evrileceğimiz diğer yazıların temelini oluşturmaktır.   Fonksiyonel programlama nedir ne değildir ve neden ihtiyaç duyarız bunları biraz düşünelim. Java yazılım geliştiriciler sürekli olarak yeni bir şeyler ortaya çıkarsak da şu özgür yazılım geliştirme hazzını yaşasak diye içlerini kurt yiyor sanki. Duramıyorlar yerlerinde ve
  • Daha okunabilir,
  • Daha maintain edilebilir ( Tamiri kolay ),
  • Daha geliştirmeye açık,
  • Daha az satır kod yazarak daha çok iş yerine getirmiş olalım diye yeni arayışlara yeni yöntemlera yöneliyorlar.
Fonksiyonel programlamada yine bu amaçlara hizmet etmesi için düşünülmüş /geliştirilmiş / tasarlanmış bir yazılım geliştirme prensibidir. Bazı yazılım dillerinde hala popülerliğini sürdüren (Lisp, Hasskel vb.) fonksiyonel programlama mantığını / mentalitesini / disiplinini javaya implementasyonu hakkında düşündüğümüzde. Sanki OOP'den vazgeçiyoruz da fonksyionel programlamaya geçiyoruz gibi bir mültecilik hazırlığı başlıyor. Yok öyle bir şey. Burası çokomelli; Fonksiyonel programlama bir yazılım geliştirme disiplinidir. Nasıl OOP'de bazı prensipleri (Inheritance, Encapsulation, Polymorphism vs.) uyguluyoruz, fonksiyonel programlamanın da prensipleri bulunmaktadır (Pure fonksiyonalite, immutability, first-class fonksiyonlar vs.). Tüm bu prensiplere girmeyeceğiz. Şunu da tam burada belirtelim ki; "Fonksyionel programlama Object-Oriented programlama'ya düşman değildir, zıttı da değildir, bir araya gelemezler diye de bir şey yoktur."  Hatta bir araya gelerek ortamı daha da güzelleştirirler. Eeee bu kadar konuştuk da nedir bu fonksiyonel programlama kardeşim? Bir prensip bir yaklaşım bir paradigma olduğu için ekmek tarifi şudur demek olmuyor maalesef. Fakat şöyle düşünerek ne olduğunu anlamlandırabiliriz; Matematikte toplam bir fonksiyondur. Toplam fonksiyonu kavramından düşündüğümüzde girdileri belirli olan ve çıktısının ne olacağı bilinmese de nasıl elde edileceği bilinen ve dönen şeyin yine girdi tipinde bir sayı olacağını bildiğimiz bir fonksiyondur. Fonksiyonel programlamada tam olarak bunu amaçlar. Girdileri bilinen herhangi yan çizmesi / falsosu olmayacağından emin olduğumuz, işlerin en küçük boyutta bir fonksiyon ile ifade edilerek beklenen tipte ve beklenen sayıda dönüş değeri olan mantıksal işlemler ile ifade ettiğimiz programlama geliştirme yöntemine diyoruz. OOP yaklaşımında bir methodun işleyişini tanımlarken 'nasıl' sorusunun karşılığını algoritmik akış olarak ifade ederiz. Yani; bir method içerisinde n tane sayının aritmetik ortalamasını bulmasını istiyorsak sırasıyla;
  • bir döngü ile verilen sayıların tamamını topla
  • döngü bittiğinde toplam değerini gelen dizi uzunluğuna böl
  • sonucu döndür.
şeklinde 3 adımda ifade edebiliriz. Aynı işlemi fonksiyonel programlama mantığı ile düşündüğümüzde ise 'nedir' diye düşünmemiz gerekir. Aritmetik ortalama nedir ? Bunu bir f(x) fonksiyonu ile ifade edecek olsam nasıl ifade ederdim.

f(x) = Σx/n

şeklinde tanımlardık. Burada ee hadi bunun kodunu yaz dediğimizde yine aynısını yazmayacak mıyız ? Evet aynısını yazacağız fakat burada amaç düşünme tarzının geliştirme mantığının değiştirilmesi olduğu için oraya odaklanmalıyız. Ve fonksiyonel programlama mantığı ile düşündüğümüzde bir işlemin çapı büyüdüğünde nasıl ele almalıyızı düşünüp bu işi anlamlı ve işlevsel en küçük fonksyionlara bölerek ilerlediğimizde işte o zaman ne olduğunu daha iyi anlayabileceğiz. Bu çerçevede düşündüğümüzde ilk aklımıza gelenler şunlar olmalı;
  • Immutable nesneler aslında fonksiyonel programlama prensiplerini kullanırken işimizi görür, çünkü state'in değişmeyeceğinden emin olduğumuz nesnelerdir.
  • Bir fonksiyonu her defasında tekrar tekrar başka sınıflar içerisinde tanımlarsam alt sınıflarda override ediyor olsam bile fonksiyonun davranışından emin olamam. O halde burada bir sanallaştırmaya ihtiyacım var.
  • Bir fonksiyonu yalnız bir işi yapıyor hale getirmek demek ele alacağım bir dizi işlemi aslında birbirini takip eden küçük fonksiyonlar olarak ele almalı ve her birinden dönecek değer tiplerinden emin olmalıyım.
Bu ve daha bir çok şey aklımıza gelebilir ve gelmeli. Bu kavramlar en temel anlamda java dünyası için Lambda fonksiyonu, Stream API ve fonksiyonel interface gibi kavramların temelini oluştururlar. Bu konulara ilerleyen yazılarda teker teker değinerek fonksyionel programlamanın javada nasıl kullanıldığını anlamaya çalışacağız. Sonuç; Anlamlı ve işlevsel en küçük yapı "neyin" cevabı olduğunu bilerek oluşturularak ilerlemek bizi fonksiyonel programlama mantığına yaklaştıracaktır.    

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir