yazan : Şadi Evren ŞEKER
Programlama yaklaşımlarından birisi olan fonksiyonel programlama günümüz dillerinin neredeyse tamamında kullanılmaktadır. Bu yaklaşımda matematik fonksiyonlarında olduğuna benzer bir şekilde alt programlar tanımlanmakta ve bu alt programların değişik argümanlar ile çalışması sağlanmaktadır. Bu yaklaşım basitçe:
Bir dilin fonksiyonel olması dilde fonksiyon veya prosedüre benzeri özellikler bulundurması ile sağlanır. Bu özellikleri tanımlamak gerekirse:
Yukarıdaki bu maddeleri bir kara kutu (blackbox) yaklaşımı olarak da düşünebiliriz. Yani alt programların, dış dünya ile (programın geri kalanı ile) olan tek bağlantıları almış oldukları ve geri döndürmüş oldukları argümanlardır (paramatrelerdir).
Aşağıda bir fonksiyon örneği verilmiştir: (JAVA, C , C++, C# dillerinde kabul edilir koddur):
int topla ( int a, int b){
return a + b;
}
Yukarıdaki kod incelendiğinde, a ve b, fonksiyona verilen argümanlardır (parametrelerdir). Dönüş değeri olarak tam sayı (integer) tipi kullanılmış ve bu durum return komudu ile belirtilmiştir. a+b eylemi ise bir alt programdır. Yani bu fonksiyon çağrıldığında icra edilen program parçasıdır.
Fonksiyonel programlama, yapısal programlamanın gerektirdiği bir yaklaşımdır. Buna göre fonksiyonel programlama kullanılan bütün diller yapısal programlama yaklaşımına uygundur denilebilir. Ancak tersi doğru değildir. Her ne kadar yapısal programlamanın tanımında bir alt programın varlığı zarurî olsa da bu alt program basit bir if bloğu olarak da düşünülebilir. Yani okuyucu kod blokları ile fonksiyonları karıştırmamalıdır.
Nesne yönelimli programlama yaklaşımınlarında fonksiyonel programlama kullanılmaktadır. Dolayısıyla her nesne yönelimli programlama yaklaşımı, fonksiyonel programlamayı barındırmaktadır. Nesne yönelimli programlama terminolojisinde, fonksiyonlara metod ismi verilmektedir.
Merhabalar, çok bilmişlik etmek istemem, ama bildiğim kadarıyla procedural programming ile functional programming birbirinden farklı kavramlar. Hatta procedural programming imperative programming’in bir alt dalı iken, functional programming ise bunun tam zıttı olan declarative programming’in bir alt dalıdır.
Örnek verecek olursak C dilinde procedural programming yaklaşımı görülürken, Scheme dilinde functional programming yaklaşımı ele alınır. Her iki dilede aşina olanlar aradaki farkları anlayabilirler.
Kesinlikle haklısınız. Karışıklığa sebep olan Pascal gibi dillerde dönüş değeri olmayan fonksiyonlara prosedür ismi verilmesi olmuş. Aslında bu durum literatürde bir kavram karmaşasına sebep oluyor. Yani prosedürel programlama kavramını modüler programlama (ve dolayısıyla fonksiyonel programlama) anlamında kullanan kaynaklar da bulunuyor. Benzer bir kavramı arayan kişiler bu yorumu okuyarak bu problemi farkedeceklerdir. Başlıktan procedural programming ibaresini kaldırdım. Ayrıca bu konuyu içeren emirli programlama (imperative programming) başlıklı yeni bir yazı ekledim.
ilginiz için teşekkürler
Anladığım kadarıyla fonksiyonel programlamada değişkenler yerine kurduğumuz fonksiyonları ve nesne tabanlı programlamadaki döngü sistemi yerine de recursive fonksiyonları kullanıyoruz. Her fonksiyon da kendi sonucunu döndürdüğünden önceden tanımlanmış değerlerden etkilenmiyor ve istenen zamanda çalışıyor. Fakat hiç mi eksik tarafı yok fonksiyonel programlamanın? Veya fonksiyonel programlama ile çalışma yaparken ne gibi sorunlar çıkabiliyor?
Aslında fonksiyonel programlama kavramı, veya programlama dillerindeki özelliklerin tamamı matematikten alınmıştır ve bilindiği üzere de matematik, mantıktan türemiştir. Fonksiyonların matematikte herhangi bir dezavantajı bir eksiği olmadığı gibi programlama dillerinde de yoktur.
Matematiksel ve teorik olarak fonksiyonlar gereklidir, kullanışlıdır ve eksiği olmaz 🙂
Ancak! Herşey gibi fonksiyonlar da yanlış kullanıldığında problem olur.
Örneğin fonksiyon bir matematiksel ifadenin daha yukarıdan görülmesini sağlar.
Mesela ben size C(5,3) yani 5’in 3’lü kombinasyonu dersem bunu aşağıdaki şekilde yazbilirsiniz:
( 5 x 4 x 3 x 2 x 1 ) / ( ( 2 x 1 ) ( 3 x 2 x 1 ) )
Ya da daha basit olarak aşağıdaki şekilde de yazabilirsiniz:
5! / (2! x 3!)
şimdi ikincisi, ilkine göre çok daha anlaşılır ve okunabilirdir. Dolayısıyla bir denklemi, bir işlemi, bir kod parçasını daha anlaşılabilir ve okunabilir yapar fonksiyonlar. Ancak burada unutulmaması gereken nokta, fonksiyonların olduğu gibi kullanıldığı ve bir fonksiyon kullanılırken alt parçalara bölünemediğidir (atomicity). Yani faktoriyel fonksiyonunu çağırdığınızda çalışır ve biter, ben fonksiyonun yarısı çalışsın istiyorum diyemezsiniz.
Benzer şekilde fonksiyonların paralelleştirilmesi (map / reduce) da problemlidir. Şayet doğru fonksiyonu doğru şekilde yazmazsanız fonksiyonlar size birer problem olarak geri döner.
Netice itibariyle, bir fonksiyon matematikte ne kadar gerekliyse, fonksiyonel programlama da o kadar gereklidir. Günümüz dillerinde pek çok programlama yaklaşımı birlikte kullanılmaktadır. Örneğin C#’ın içerisinde çok sayıda fonksiyonel programlama özelliği bulunmaktadır.
Çoğu yazılım mühendisliği yaklaşımı, derleyici tasarımı ve donanım fonksiyonel programlamayı da göz önünde bulundurularak geliştirildiği için bu alanlarda da fonksiyonel programlamanın bir dezavantajı görülmemektedir. Ancak tasarım ve kodlama aşamasında her zaman hata yapılabilir ve bu hataların fonksiyonel programlama için yapılması, diğer yaklaşımlarda olmayan farklı problemlere sebep olabilir.
Bilgilendirme için çok teşekkür ederim (=