Data Vinci 3: Functional Programming

“Programming Paradigm” başlığı altında karşımıza çıkabilecek olan bir terim. Programlama yaklaşımına bir tanım getirir. Sonuç itibariyle yazmış olduğumuz kodların davranışları farklılıklar gösterir. Fonksiyonel programlamada “state” değişikliklerinden kaçınılır, kod bloğunu yan etkilerden korumak adına aldığı parametreye göre işler ve sonuçlandırır. Daha çok expression’lar kullanılmaktadır. Common Lisp, Haskell, Erlang, F# gibi “pure functional” olarak çalışan programlama dilleri mevcut. Fakat karışıklık olmasın, bu tanım herhangi bir programlama dil ailesine ait değildir. Java ve C# gibi object oriented çalışan dillerde de fonksiyonel programlama yapılabilir. Daha çok akademik camiada bilinen ve uygulanan bir konsept olarak karşımıza çıkıyor.

Method dışındaki bir değişkenin durumunu(state) değiştirmeme, listeler içerisinde iterasyon yapmama, “adı da üstünde zaar” fonksiyonları kullanma, imperatif değil deklaratif kod blokları oluşturma, pipeline kullanmak fonksiyonel programlamanın ana konseptleridir.

İtiraf etmek gerekirse yazının buraya kadar olan kısmında “iyi hoş demişsin de, ben hiçbir şey anlamadım” diyen birisine “haklısın” demekten başka çarem yok. Konuyu biraz daha basite indirgemeye çalışırsam, nesneye dayalı programlama dilleri için, her şey bir “nesne” dir, evren bir toz bulutu idi ama object’ten türüyordu yine de… Nesneye yönelik programlama dünyasında durum böyle iken, fonksiyonel programlama dünyasında ise nesne kavramı yer almıyor. Nesneye yönelik veya imperatif de diyebileceğimiz yaklaşımda bu tarz işlemler yapılmamakta. Daha çok matematiksel mantığa bağlı  fonksiyon, yeri geldiğinde özyineleme(recursion) kullanarak aynı işi deklaratif dillere göre daha az kod ile yapmaktadır, fonksiyonel programlama paradigmasının en çok eğildiği olgu “recursion” diye geçen kendi kendini çağıran fonksiyonlar. Fonksiyonel programlama yaklaşımının avantajı sistem büyükdükçe ortaya çıkacaktır (stackoverflow’un yalancısıyım), çünkü yapı ne kadar karmaşıklarsa test etmesi, üretim ortamına alınması, refactoring işlemleri o kadar sancılı olacaktır. Bu noktada fonksiyonel programlama paradigması “persil yeşil güç” gibi gelir spagetti’leri söker atar, çünkü aynı işleri çok daha az kod bloğuyla yapar 🙂 Nesneye dayalı bir programlama dili ve obje yaklaşımıyla “Orhun kitabeleri”ne rakip olacak kadar uzun bir kod bloğu, fonksiyonel programlama yaklaşımıyla inanması zor ama 3-5 satıra inebiliyor.

İnternet’te konu ile ilgili araştırma  yaparken şahit olduğum şaşırtıcı şeylerden birisi, benzer işleri çeşitli programlama dilleri ile deklaratif ve imperatif şekilde yazarak yapılan karşılaştırma tartışmalarıydı. Bunun yanısıra bir de “high-order function” kavramı ilgi çekicidir ki fonskiyon parametre olarak başka bir fonksiyon alıyor ve geriye sonuç olarak da bir fonksiyon döndürüyor. Tam bir WTF! Klasik yaklaşım ile programlamaya alışmış biz “çomar” yazılımcıları “fularlı” seviyesine götürecek, “elit” bir kavram.

Fonksiyonel programlama paradigmasında yer alan bir diğer “fularlı” konu ise “pipeline” kavramı. Boru hattı şeklinde çevirince Tüpraş ile bağlantısını sorgulatır. Fakat teknik çevirisi “Ardışık düzen” olarak yapılırsa daha doğru olacaktır. Ardışık düzen demek tüm yazı boyunca bahsettiğimiz, durum tutmama, işlem sonuçlarının birbirleriyle karmaşık bir bağa sahip olmaması, fonksiyonlarla -“ateş edip unutulması”- çalışıp hemen sonuç üretilmesi şeklinde açıklanabilir. Aslında sadece fonksiyon programlamaya ait bir kavram da değil “pipelining”. Linq ile haşır neşir olan arkadaşlar “Lambda” kavramını hatırlayacaktır, bu yöntemde bir çeşit “pipelining” olarak ifade edilebilir.

Konu ahkâm kesebileceğim bir alan değil, sadece böyle bir paradigmanın varlığına değinmek, anlayabildiğim kadarıyla da yorumlamak istedim. Son olarak tüm bu aforizmalar, iddaaların boşa olmadığını kanıtlayabilecek, kendi kod parçam değil fakat İnternet’te bulduğum bir kod karşılaştırması ile yazıyı bitiriyim.

Resim Kaynağı: A pratical introduction to functional programming

Görüldüğü üzere 4 satırlık bir kodu, Fonksiyonel programlama yaklaşımı ile yazmak 2 satır. Satır sayısı(Line of Code) bir kalite ölçüsü müdür? Yerine göre evet, yerine göre hayır. Kod satır sayısı da bir metrik olarak kullanabilir. Kulağımıza küpe olsun.

Faydalı olması dileğiyle…

keep_calm

Leave a Reply

Your email address will not be published. Required fields are marked *