#3 Functional vs Object-Oriented vs Procedural

Ezgi Fıstıkçıoğlu
Huawei Developers - Türkiye
5 min readApr 25, 2021

Yazının 1. serisinde programlama paradigması nedir, örnekleri günlük hayattan nasıl verebiliriz, prosedürel programlama nedir gibi başıkları ele almıştık.

Yazının 2. serisinde ise object oriented(nesne yönelimli) programlamayı işleyip anlşılacağındı düşündüğüm şekilde aktarmaya çalışmıştım. Son kısmında ise OOP~ PP karşılaştırması yapıp yazıyı sonlandırmıştık.

Bu yazımda sizlere declarative paradigma kapsamında olan fonksiyonel programlamayı anlatacağım. Hazırsak başlayalım. 💪

Functional programming (FP) (Fonksiyonel Programlama)

Kodunuzu her fonksiyonun kendi başına çalıştığı birden çok fonksiyon halinde düzenlemenizdir.

Matematiksel foksiyonlara dayanmaktadır. Matematiksel fonksiyonları program bileşenleri olarak oluşturarak problemi çözmeye çalışır.

Fonksiyonları bir lego parçası olarak düşünebiliriz.

Bir lego ev inşa etmeyi hayal edelim. Önce her bir lego parçasının bir görevi olacak ve bu lego parçası sadece hayalimizde canlandırdığımız evin duvarının bir parçasını oluşturacak. Bu legoyu bir kez daha kullanma ihtimalimiz 0 çünkü aksi halde ev yıkılır. Bu lego parçamız görevini yaptı, duvarı kendi yetkisi kadar şekillendirdi ve tamam onl işimiz bitti.

Sonra diğer lego parçaları da aynı mantıkla bir araya geldiler ve çatısı da dahil çok tatlı bir lego evimiz oldu. ☆⭐️

Tekniğe dönelim, bir result almak için verileri fonksiyondan fonksiyona geçirmekle ilgili bir programlamadır diyebiliriz.

FP’de değişkenler(variables), nesneler(objects), atamalar(assignments) yoktur, “fonksiyonlar” data(veri) olarak ele alınır, bunları parametre olarak kullanabilir, döndürebilir(return), diğer fonksiyonlardan fonksiyon oluşturabilir ya da custom fonksiyonlar oluşturabilirsiniz.

Fonksiyonlar durum bilgisiz(stateless) ve saf(pure) olmalıdır, ayrıca yan etkilere(side-effects) neden olmamalıdır. (örneğin, Js’de DOM’u değiştirmek gibi).

En büyük avantajı, bu programların çok çekirdekli ve çok iş parçacıklı ortamlarda kolayca çalışabilmesidir.

Yanda bir f(x) fonksiyonu görüyoruz. Bu fonksiyon bize x+5 değerini verecek. x’e ne verirsek verelim çıktıları hep bir sayı olacak ve bu da stateless yapımıza oldukça uygun.

Değişmezlik, fonksiyonel programlamanın en önemli özelliklerinden biridir. var tipinde a adlı bir değişken oluşturduk. Bu a değişkenine 70 değerini verdik ve artık a hep 70 olacak kalacak, değişmeyecek, b değişkeni de a’yı değiştiremeyecek.

Girdiler integer, string, float vs. gibi değerler olabildiği gibi bir fonksiyon da olabilir. Resimde bir toplama işlemi yapan fonksiyon görüyoruz ve bu herhangi bir durum değişikliği yapmıyor ve yapmayacak. Geriye sadece bir result dönderiyor. Süper o zaman bu pure bir fonksiyondur.

Son örnekte bir result değişkeni tanımlanmış ve buna default olarak 0 değeri atanmış. Sonuç değişkeni durum değişkenine etki ediyor ve artık stateless değil statefull yapısına uymuş oluyor. O zaman bu fonksiyon pure değil, fonksiyonel programlamaya da uygun değil diyebiliriz.♉ฺ

✳️Haskell, JavaScript, Scala, Erlang, Lisp, ML, Clojure, OCaml, Common Lisp, Racket.

İşlevsel programlama yalnızca PURE işlevlerinden oluşur.

🟣Pure Fonksiyonlar Nedir?

Pure fonksiyon, aynı tipte(type) girdi verildiğinde her zaman aynı çıktıyı döndürecek bir fonksiyondur, local(yerel) veya global bir duruma bağlı değildir. Giriş bir diziyse, çıktı yeni bir dizi olacak ve giriş dizisi değiştirilmeyecek. Pure fonksiyonlar durumunda, output sadece input’a bağlıdır.

Scala dilinde, değerleri alan ve bunların toplamını döndüren bir fonksiyon.

🟣Side Effect Nedir?

Bir fonksiyonun kendi kapsama (scope) alanı dışında birşeyleri değiştirmesi durumudur.

Fonksiyonel programlamada “değişken” diye bir kavram olmadığından ve her şey eninde sonunda bir fonksiyon oldugundan “degiştirebileceğiniz” degişkenler ve durumlar aslında yoktur. Ama yan etki illa, değişken olmalı diye bir kural tabi ki yok. Konsola çıktı yazmak, loglama yapmak, ekrana pencere çıkarmak, sistemdeki dosya, yazıcı, kamera gibi başka kaynaklara erişmek hepsi yan etkiye sebep olur.

Java’da fonksiyonel programlama lambda ile yapılıyor. Bu örnekte sadece bir şekil kullanmak istedim çünkü bildiğiniz üzere functional programming de class’lar desteklenmiyor. Mantık olarak elimden geldiğince aktarmaya çalıştım. Konu dışına çıkmamak adına detaylı anlatmayacağım zaten basic bir örnek olduğu için rahatlıkla anlaşılacağını düşünüyorum. (Lambda ayrıntısı için buraya göz atabilirsiniz: https://thrkardak.medium.com/fonksiyonel-java-19217f08566e )

📌Fonksiyonel Programlamanın Faydaları

  • Koddaki sorunları ve hataları karıştırmamanızı sağlar.
  • Paralel işleme ve eşzamanlılık sağlar.
  • Daha kısa kodla daha iyi modülerlik sunar.
  • Geliştiricinin verimliliğini arttırır.
  • Yuvalanmış işlevleri destekler.
  • Lambda Matematik’in etkin kullanımına izin verir.

📌Fonksiyonel Programlamanın Sınırlamaları

  • Fonksiyonel programlama paradigması kolay değildir, bu yüzden yeni başlayanlar için anlaşılması zordur.
  • Kodlama sırasında birçok nesnenin evrimleşmesini sağlamak zordur.
  • Kapsamlı çevre kurulumu gerektirir.
  • Yeniden kullanım çok karmaşıktır ve sürekli olarak yeniden düzenlenmesi gerekir.
  • Nesneler sorunu doğru göstermeyebilir.

Fonksiyonel Programlama(FP) ~ Nesne yönelimli programlama (OOP)

00P 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.

input-output

00P 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ştirmezler.

  • En önemli fark ise paralel programlama (paralel programming). Yazılımcıların en sık söylediği şey “Benim makinemde çalışıyordu.” 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.

Serinin sonuna geldik. Umarım keyifle okumuşsunuzdur ve umarım faydalı olmuşur. 🙏

Belli bir kaynakça veremeyeceğim çok fazla şey okudum. Bazılarını referanslar kısmına ekleyeceğim.

REFERANSLAR :

✔️https://scoutapm.com/blog/functional-vs-procedural-vs-oop

✔️https://academind.com/tutorials/functional-vs-oop-vs-procedural/

✔️https://dev.to/vaibsgharge/imperative-vs-declarative-programming-your-enemy-is-not-object-oriented-programming-52fe

✔️https://www.infoworld.com/article/3314640/functional-programming-for-java-developers-part-1.html

✔️https://cs.lmu.edu/~ray/notes/paradigms/

✔️https://soshace.com/functional-vs-object-oriented-programming/

--

--