ÖNEMLİ : Kendim için aldığım notlar. Umarım size de bir faydası olur. Kullanılan her bir makale referans olarak eklenmiştir.

Programlama Stili Serisi


  1. Programlama Stili Part 1 - Imperative and Declarative Style Programming (Zorunlu ve Bildirimsel Stil Programlama)
  2. Programlama Stili Part 2 - Higher Order Functions (Üst Düzey Fonksiyonlar)

Her şeyden önce, üst düzey fonksiyonları(yani higher order functions) anlamak için bazı tanımları bilmeliyiz. “birinci sınıf vatandaş(first-class citizen)” terimiyle başlamak istiyorum

Birinci sınıf vatandaş (First-class citizen)

Wiki tanımına göre, programlama dili tasarımında, belirli bir programlama dilinde birinci sınıf vatandaş (ayrıca tür, nesne, varlık veya değer), genel olarak diğer varlıklar tarafından kullanılabilen, tüm işlemleri destekleyen bir varlıktır. Bu işlemler tipik olarak argüman olarak iletilmeyi(passed as an argument), bir işlevden döndürülmeyi(returned from a function) ve bir değişkene atanmayı(assigned to a variable) içerir.

Bu tanıma göre, yukarıda vurgulanan işlemleri destekleyen her şey birinci sınıf vatandaş(first-class citizen) olabilir. Buraya bir virgül koyup birinci sınıf işlev(first-class function) olan bir sonraki tanıma geçmek istiyorum.

Birinci-sınıf işlev (First-class function)

Birinci sınıf vatandaşın(first-class citizen) ne olduğu hakkında biraz fikrimiz var. O halde, işlevlere birinci sınıf vatandaşlar gibi davranan bir programlama dilinin birinci sınıf işlevlere(first-class function) sahip olduğu söylenebilir.

Üst Düzey Fonksiyonlar (Higher Order Functions)

Normal fonksiyonlarda genel olarak;

  • Nesneleri fonksiyonlara geçirebiliriz
  • Fonksiyonlarda nesneler oluşturabiliriz
  • Fonksiyonlardan da nesne döndürebiliriz

Üst düzey fonksiyonlarda;

  • Fonksiyonları fonksiyonlara geçirebiliriz
  • Fonksiyonlar içinde fonksiyonlar oluşturabiliriz
  • Fonksiyonlardan da fonksiyon döndürebiliriz.

Açıklığa kavuşturmak için iki kod örneği paylaşmak istiyorum.

Örneğin;

1
2
3
4
5
6
7
8
Thread t1 = new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("This is a thread");
    }
});

t1.start();

Yukarıdaki örnekte, Thread kurucusuna(yani constructor) bir Runnable nesnesi iletiyoruz. Burada nesne birinci sınıf vatandaş olarak davranır.

1
2
3
Thread t2 = new Thread( () -> System.out.println("Another thread"));

t2.start();

Fakat fonksiyonlara veya kodlara da birinci sınıf vatandaşmış gibi davranabiliriz. Bu örnekte, lambda ifadesi(anonim) olan bir fonksiyonu, Thread kurucusuna argüman olarak iletiyoruz. Bu onu üst düzey(yüksek dereceli) fonksiyon yapar çünkü parametre olarak başka bir fonksiyon alır.

Not:


İngilizce terimlerin türkçe anlamlarının tam olarak neye karşılık geldiğini bilmediğim için parantez içerisinde ingilizce karşılıklarını da yazmaya gayret ettim. Umarım kafanız karışmaz.

  • Higher-order functions : üst düzey fonksiyonlar, yada yüksek dereceli fonksiyonlar olarak geçiyor.
  • First-class citizen : birinci sınıf vatandaş
  • First-class function : ise birinci sınıf fonksiyon olarak geçiyor.

Referanslar: