Fonksiyonel Programlama

17 Temmuz 2016 2 dk okuma süresi 131 okunma
Genellikle fonksiyonel programlama (FP) tartışmalarında nesne yönelimli (OOP) diller ile fonksiyonel programlama yapılamaz gibi söylemler olur. Bu kesinlikle yanlıştır. En basitinden C# tamamen OOP bir dil olmasına rağmen FP'yi destekler.

Programlama dilleri imperatif (imperative - belirli bir davranışta bulunmaya zorlamak) ve uygulamalı (applicative) olmak üzere ikiye ayrılır. İmperatif (imperative) programlama dilleri: C, C++, C#, Java vb. Bu dillerde sonuç odaklı olunduğundan değişkenler tutup durumlarını güncelleyerek sonuca ulaşırız. Uygulamalı (applicative)'in sözlük anlamı ise "bildirilen, beyan edilen"dir. Uygulamalı programlama dilleri ise Scala, Lisp, Haskel vb. Bu dillerde ise olayın kendisini ifade etmeye yani hesaplamalara odaklanılır. Bu nedenle aslında hemen herkes FP'yi bilerek veya bilmeyerek kullanmıştır. Özellikle JavaScript ile uğraşıyorsanız mutlaka kullanmışsınızdır. FP'ye en iyi örnek ise jQuery'dir.

Fonksiyonel programlama en basit örnek ile matematik fonksiyonlarıdır. Değişkenler (variables), nesneler (objects), atamalar (assignments) yoktur. Sadece fonksiyonun çalışabilmesi için gerekli değerler yani girdiler vardır. Bu değerler integer, float, string gibi değerler olabildiği gibi bir fonksiyon da olabilir.

function toplam (a, b) {
 return a + b;
}

Fonksiyonel programlama da değişkenlerin olmayışı akışın durumsuz (stateless) olmasını sağlar. Yani yukarıdaki toplama fonksiyonunda görebileceğiniz gibi durumunun değiştiği herhangi bir değişken yoktur. Geriye sadece sonuç döndürürler. Bu durum aynı zamanda yan etkileri (side-effects) ortadan kaldırır. Buna aynı zamanda saf fonksiyon (pure-function) denir.

var sonuc = 0;
sonuc = toplam(1, 2);

function toplam (a, b) {
 toplam = a + b;
}

Yukarıda sonuc değişkenin durumu değişiyor, bu nedenle artık toplam fonksiyonu hem stateless değildir hem de saf fonksiyon değildir ve fonksiyonel programlama olarak görülmez.

OOP ile FP arasındaki farklar

  • OOP sonuç odaklıdır, değişkenler, nesneler ve atamalar vardır, FP'de sadece fonksiyonun çalışabilmesi için gerekli değerler yani girdiler vardır.
  • OOP genellikle durumlara (state) bağlıdır, yani değişkenlerin, objelerin durumları değişebilir, FP ise tamamen durumsuz (stateless)'dur. Geriye sadece sonuç dönerler ve herhangi bir değişkenin veya objenin durumu değişmez.
  • En önemli fark ise paralel programlama (paralel programming). Yazılımcıların en sık söylediği şey "Benim makinemde çalışıyor"dur. FP bunu ortadan kaldırır. Çünkü ortam bağımsız sadece aldığı girdilere göre sonuç döner. Bu her ortamda aynı olur. Daha anlaşılır bir örnek olarak işlemcileri (cpu) ele alabiliriz. Şu an çekirdeğe daha fazla transistör sığrıdılamıyor, bu nedenle sürekli çekirdek ekleniyor. 2-4-6-8 çekirdekli işlemci gibi. İşlemciler FP ile çok daha performanslı çalışabilirler çünkü herhangi bir durum (state) olmayacak. State olması demek yan etkilerin (side-effects) olması anlamına geliyor. Yani birşeyin durumunun değişmesi başka şeyleri tetikleyebilir.
Yazılarıma abone olmak ister misiniz?
Spam yapılmaz, sadece bildirim amaçlıdır. İstediğiniz zaman abonelikten çıkabilirsiniz.
İlginizi çekebilecek diğer yazılar.
İnternet üzerindeki birçok bilgi malesef çöp. Çöpten kasıt faydasız anlamında değilde aynı içeriğin 3-5 kelimesinin değiştirilerek tekrar yayınlanmasıdır. Aramalarda üst sıralarda çıkmak için mutlaka kaliteli içeriğe sahip olmak gerekir. Bu yazı size nasıl kaliteli içerik yazmanız gerektiğini gösterir.

Günümüz şartlarında motivasyon ve üretkenlik çok önemlidir. Gün içerisinde birçok kez motivasyonunuzu kaybedebilirsiniz fakat bunu geri kazanmanın ve konsantre olmanın birçok yolu var.

Statik ve dinamik programlama dilleri nedir ve aralarındaki farklar nelerdir