Photo by Ren Ran on Unsplash

JS ILE FONKSIYONEL PROGRAMLAMA

Fonksiyonel Programlama Nedir?

Fonksiyonel Programlamanın amacından ve temel kavramlardan bahsedeceğim. High Order Functions

Onur Dayıbaşı
Frontend Development With JS
4 min readJan 30, 2020

--

Bu yazıyı daha önceden yazmış olduğum JS ile Fonksiyonel Programlama yazısının bir devamı olarak yazıyorum. Bir çok kavramı tek bir yazıda ele almanın yaratacağı karmaşıklıktan kaçmak için bu şekilde bir yönteme başvurdum.

OOP(Object Oriented Programlama) ve Procedural Programlamada global bir state tutup bu state fonksiyonlar ve objeler arasında ilerletilerek bu state sağına, soluna içerisine yeni özellikler ekleyerek bükülmesi/evrilmesi ve değiştirilmesi üzerine kuruluyken , Fonksiyonel Programlama’da amaç bundan kaçmaktır. Bundan dolayı programa fonksiyonların fonksiyonları çağırdığı matematiksel bir işlem topluluğu olarak bakar.

Buda fonksiyonel programlamada aşağıdaki prensipleri baz almamızı gerektirir.

  • Object ,Object/Class hiyerarşisi yerine Fonksiyonun fonksiyonu kapsaması (Function Composition, First Class Functions)
  • Ortak bir state tutup bunun sürekli değiştirilmesindense çevresini etkilemeyen ve kendi kapsamı içerisinde çalışan fonksiyonların oluşturulmasını (Avoid Sharing Data, Pure Functions)
  • Sürekli değiştirilebilen objeler ile çalışmak yerine yeni objeler oluşturup bunlar üzerinde çalışan mekanizmaların oluşturulması (Avoid Mutation, Immutable Data)
  • Kodun içerisinde yan etkisi olan fonksiyonlardan olabildiğince sakınmak ve bunları belli fonksiyonlar içerisinde toplamak. (Avoid Side effects)
  • Kod geliştirirken nasıl yaptığına değilde, ne yaptığına odaklanarak kod geliştirme. (Declarative Programming)
  • Fonksiyonel programlamada akışları döngüleri , fonksiyonların fonksiyonları çağırmasını soyutlaştırmanın yöntemini kullanarak for looplardan , procedural fonksiyon çağrımlarından kurtulmayı amaçlar. (High Order Functions)

Fonksiyonel programlamayı anlatmaya başlamadan bazı temel kavramlar üzerinde duracağım.

Bu blog yazımda özetle;

  • First Class Function Nedir?
  • Pure Functions Nedir?
  • Shared State (Ortak Durum) Nedir?
  • Immutable Data Nedir?
  • Side Effect (Yan Etki) Nedir?
  • Declarative Kod Geliştirme Nedir?
  • High Order Functions Nedir?

1. First Class Function Nedir?

Fonksiyonun programlama dili içerisinde değişken olarak kullanılabilmesi durumunda first class function denir. Fonksiyonel programlamada dilin f(g(h(x))) şeklinde fonksiyonların fonksiyonlar üzerinde işlem yapabilmesine izin vermesi gerekir.

  • fonksiyonu bir değişkene atama
const sum=function(a,b){return a+b;}
sum(2,3);
  • fonksiyonu başka bir fonksiyona parametre
const calculate(op,a,b){op(a,b)};
calculate(sum,3,2);
  • return değeri olarak fonksiyon dönebilmeli
getSum=()=>{return sum(a,b){return a+b}}

Bu konu bizim ileride üzerinde daha detaylı duracağımız Function Composition oluşturmasını sağlar. Bir fonksiyonun diğer fonksiyonu kapsaması yeni fonksiyon yapıları oluşturur.

2. Pure Functions Nedir?

Saf fonksiyonlar

A. Aynı parametre girdilerinin sonucunda her zaman aynı sonucu oluşturacak;

  • Yani fonksiyon kendisine geçirilen parametreler dışında dışarıdan bir global değişkeni kullanmayacak
  • Dışarıdan bir I/O işlemi gerçekleştirerek bir request/response sonucu olan bir değerin sonucunu fonksiyonun içerisinde kullanmayacak
  • Fonksiyonun içerisinde random bir değer üretip kullanmayacak.

B. Dışarıya Herhangi Bir Etkisi Olmamalı

  • Fonksiyon içerisinde yapılan işlemler ile dışarıdaki bir state/durumu değiştirmemeli.

3. Shared State (Ortak Durum) Nedir?

Global olarak veya kendi parent scope tutulan bir değişkenin alt fonksiyonlar tarafından erişilmesi kullanılması ve değiştirilmesi, paylaşılmasıdır.

4. Immutable Data Nedir ?

Bir data oluştuktan sonra Object, Array vs bunun değiştirilmemesi anlamına gelir. Normal procedural programlamada biz bu değişimleri sürekli gerçekleştiririz. Bir fonksiyonun içerisinde bir veri yapısını geçirip bu obje üzerinde değişiklikle yaparız.

const immutable sanmayın değildir çünkü bu sadece ilgili değişkene ilk değer atandıktan sonra yeni bir değer/obj/array referansı atmanıza izin vermez ama objenin içerisindeki property değiştirebilir veya array elemanlarında değişiklik yapabilirsiniz. Bunu değişmezliği sağlamanın bir yöntemi Object.freeze kullanmaktır. Ama nesneden yeni bir nesne türetmek istediğinizde bu deep copy(derin kopyalama) yöntemi ile oldukça maliyetli olacaktır. Bunun yerine daha performanslı tries veri yapısını kullanan kütüphanelerden immutable.js veya Mori kullanabilirsiniz.

Bu konu önemli çünkü OOP veya Procedural Programlama yaklaşımından farklı olarak dışarıdaki ortak bir state değiştirmeden ilerleyebilmeniz için bu altyapının sağlanmış olması gerekir. (Avoid Shared State and Mutation)

5. Side Effect (Yan Etkisi) Nedir?

Fonksiyonlarda yan etki nedir?

  • Fonksiyon dışarıda genel bağlamında(global scope) veya ebeveyn bağlamında(parent scope) değişkeni güncellerse veya değiştirirse.
  • Console log yazdığı durumda (console.log, system.out.print)
  • Ekrana çizim yaptığında.
  • Dosyaya yazdığında
  • Network yazdığında
  • Dışarıdaki bir process tetiklediğinde
  • Veya yan etkiye sahip bir fonksiyonu çağırdığında

(Avoid Side Effects) Bir programda yan etkisi olmadan fonksiyon yazmak pek mümkün değildir ama bunları olabildiğince belli gruplarda toplayarak programın içerisine yayılmasını engellemek ileride yapılacak değişiklikler ve bakım aşamasında büyük kolaylıklar sağlayacaktır.

6. Declarative Kod Geliştirme

Bu konuda daha detaylı bilgi almak için Imperative/Declarative Programlama yazımı okumanızı öneririm.

Türkçede emir, buyruk, zorunluluk anlamına geliyor. ise bildiren, açıklayan anlamındadır. Yabancılar ise imperative işlemi nasıl anlattığın, declarative ise anlattığın programlama şekli olarak tanımlıyorlar.

Fonksiyonel programlama da declarative kod geliştirmeye çalışmak gerekir. Yani akış kontrolünün nasıl yapıldığını anlatmak ile uğraşmayan, bu akışları soyutlayan, veri akışında ne yapıldığına odaklanan programlama yaklaşımıdır.

7. High Order Functions Nedir?

Argümanlarında 1 yada 1 den fazla function referansını parametre olarak alan veya return değerini geriye fonksiyon olarak dönen fonksiyonlara High Order Functions denir. Çok yakından tanıdığımız Array sıkça kullandığımız aşağıdaki fonksiyonların hep bu türde fonksiyonlardır.

[].forEach (e=> …) //iterate every elements
[].find(e=>…) //return an element according to condition
[].findIndex(e=>…) //return an element index according condition
[].filter(e=>…) return items according to condition
[].sort(e=>…) sorts according to given condition
[].map(e=>…) transform existing array to other array
[].reduce(e=>…) combines elements and return an element
[].some(e=>…) check some elements
[].every(e=>…)

Birde return değeri olarak fonksiyon dönen bir örnek vermek istersek aşağıdaki popüler örneği verebiliriz. Ben bir 10 toplayıcısı oluşturmak istiyorum. Bu tip fonksiyon template oluşturmak ta High Order Functions kullanabilirsiniz.

function makeAdder(x){
return function add(y){
return x+y;
}
}
const tenAdder=makeAdder(10);
console.log(tenAdder(12)); //22

High Order Fonksiyonlar şu amaçla kullanılırlar;

  • Aksiyonları soyutlamak ve izole etmek, async callback fonksiyonların akış kontrollerinde, promises, monads vb..
  • Fonksiyon listesi alıp geriye dönüş değeri olarak bunların birbirini kapsadığı function composition döndüğü fonksiyonlar.

Referanslar

Okumaya Devam Et 😃

Bu yazının devamı veya yazı grubundaki diğer yazılara erişmek için bu linke tıklayabilirsiniz.

--

--