Nedir bu fonksiyonel programlama dedikleri şey?

Hepimizin son zamanlarda çokça duyduğu bir programlama paradigması olan fonksiyonel programlama aslında uzun yıllardır hayatımızda.

  • imperative (1957, Fortran)
  • functional (1958, Lisp)
  • object-oriented (1972, Smalltalk)
  • logic (1972, Prolog)

Lisp’in ortaya çıkmasıyla hayatımıza giren bu paradigma beraberinde birçok yeniliği getirmiştir. Güncel makalelerin aksine, bu paradigmayı size daha farklı bir bakış açısıyla anlatmaya çalışacağım.

Şu terimlere daha aşina olduğumuz söylenebilir; imperative diller “How? (Nasıl)” , functional diller ise “What? (Ne)” ile ilgileniyorlar fakat nedir bu söylenilmek istenilen?

Ufak bir örnek verelim, örneğin bir kişinin bizim için çilekli pasta yapmasını istiyoruz ona functional ve imperative şekilde komutlarımızı verelim.

İlk olarak imperative yaklaşımı ele alalım; “Buzdolabını aç -> malzemeleri çıkar -> çilekleri doğra -> pasta kalıbını hazırla -> ocağı yak -> sütü aç ve kaba doldur…..ve bu şekilde her adımı tanımlıyoruz”
Functional yaklaşım ise; “Senden bir adet çilekli pasta yapmanı rica ediyorum benim için yapar mısın? (Ben çoğu şeye karışmayacağım, tabi ki bazı adımları tanımlıyoruz fakat imperative yaklaşıma göre çok az şekilde çünkü elimizdeki bir tür yapay zeka değil :)”

Clojure dili ile yazılan basit bir kod örneği üzerinden gidelim;

(every? #(Character/isUpperCase %) "HELLO")
=> true

Kod oldukça expressive bir yapıya sahip, “HELLO” kelimesindeki her bir karakter büyük mü eğer öyleyse true değilse false değeri dönüyor, bunun nedeni declarative yapıya sahip olması. Bu sayede sanki İngilizce cümleler yazar gibi kodumuzu tasarlayabiliriz. Böylelikle yazdığımız projelerin kod hacimleri çok ciddi derecede azalıyor.

Tabi fonksiyonel paradigma bu anlattıklarımdan ibaret değil, tamamen kavrayabilmek için altında desteklediği fikirleri sizlerle paylaşmak istiyorum. Buraya kadar anlattıklarım high level bir bakış açısı sunabilmek içindi.

Şimdi fonksiyonel programlamanın kalpten desteklediği fikirleri alt başlıklar altında toplayacağım bu tasarım fikirleri diğer diller için de uygulanabilir, bu yaklaşımları ne yazık ki diğer dillerdeki (Java, Python vs.) geliştirme kültürleri farklı şekillendiğinden ötürü çok fazla göremiyoruz.

Pure Functions

Pure fonksiyonlar belli bir girdi verildiğinde hep aynı çıktıyı üreten fonksiyonlardır. IO tarzı işlemleri içlerinde bulundurmazlar. Böylelikle programınızın anlaşılması ve test edilmesi çok kolay olur. Pure fonksiyonlarla yazılan fonksiyonun testi için mock mekanizmalarına kesinlike ihtiyaç duymazsınız çünkü yaklaşımınız data yönelimlidir.

Örnek bir pure fonksiyon verelim:

(+ 1 2)
=> 3
;; hiçbir zaman 3'ten başka bir değer dönemez.

Eğer kodunuzu pure fonksiyonlar (side effect free) çevresinde tasarlayıp IO (dış dünya) tarafını izole ederseniz işleriniz ummadığınız kadar kolaylaşır.

Immutability

Fonksiyonel programlama immutable veri yapılarını kullanmamızı destekler, çünkü sağlamış olduğu avantajlar programlarımızın düzgün çalışmasında ciddi role sahiptir.

En önemli çözdüğü sorunlardan bir tanesi ise concurrency’dir (eş zamanlı programlama). Immutable bir veri yapısını farklı bir thread’e yolladığımız zaman değişmeyeceğini bildiğimiz için istediğimiz aksiyonu korkusuz bir şekilde almamızı sağlıyor.

Immutable olduğu için datamızı saklamamıza da gerek yok çünkü hiçbir şekilde değiştirilemez. (Java’nın yaklaşımının aksine)

Higher Order Functions

High order fonksiyonlar argüman olarak fonksiyon alan bir çeşit fonksiyonlardır. Fonksiyonel programlamada fonksiyonlar first class citizen oldukları için bu tür bir esneklik sağlanmış oluyor.

Bu şekilde fonksiyonlara fonksiyon geçirme işlemi bizleri birçok dertten kurtarabiliyor örneğin; data process etmek, abstraction kurma veya izolasyon sağlama konuları gibi.

Örnek bir kod görelim tekrar:

(map inc [1 2 3])
=> (2 3 4)

map fonksiyonu inc (increment) isimli bir fonksiyonu parametre olarak geçiriyor.

Yazıyı uzun tutmamak adına burada bitiriyorum, bu paradigmanın daha çok desteklediği fikirler mevcut tabi ki. Eğer fonksiyonel programlamaya başlamak isterseniz Clojure Programalama Dilini şiddetle öneririm :)

Merak edenler için Clojure ile yazılmış open source projelerime buradan ulaşabilirsiniz.

Sevgiler…