Diskon toko punya banyak varian: diskon member, kupon, atau tanpa diskon. Menulis satu method per varian lalu memilihnya dengan if-else membuat kode sulit diperluas. Higher-order function menawarkan jalan yang lebih rapi: method yang menerima method lain sebagai parameter, atau mengembalikan method baru sebagai hasil kerjanya.

Definisi formalnya singkat: higher-order function adalah function yang menerima function sebagai parameter atau mengembalikan function. Di C#, bentuk function-nya adalah delegate, sehingga setiap parameter Func, Action, atau Predicate, serta setiap return type Func, menjadikan method tersebut higher-order.

Method yang Menghasilkan Method #

csharp
static Func<int, int> BuatDiskon(int persen)
{
    return total => total - total * persen / 100;
}

static void TampilkanHarga(string nama, int harga, Func<int, int> transformasi)
{
    Console.WriteLine($"{nama}: Rp{transformasi(harga)}");
}

Func<int, int> diskonMember = BuatDiskon(10);
Func<int, int> diskonKupon = BuatDiskon(25);

TampilkanHarga("Baju batik", 240000, diskonMember);
TampilkanHarga("Baju batik", 240000, diskonKupon);
TampilkanHarga("Baju batik", 240000, harga => harga);

Output yang Dihasilkan:

text
Baju batik: Rp216000
Baju batik: Rp180000
Baju batik: Rp240000

Bedah Kode Baris per Baris #

Mari kita telaah kode di atas:

  1. Baris 1-4: BuatDiskon adalah higher-order function pertama: return type-nya Func<int, int>. Setiap panggilan menghasilkan lambda baru yang mengingat nilai persen lewat closure.
  2. Baris 6-9: TampilkanHarga adalah higher-order function kedua: parameter transformasi bertipe Func<int, int>. Method ini tidak tahu aturan diskon apa pun; ia hanya menerapkan method yang diterimanya.
  3. Baris 11-12: Dua panggilan BuatDiskon menghasilkan dua strategi berbeda dari satu cetakan yang sama, masing-masing dengan closure persen sendiri.
  4. Baris 14-16: Ketiga pemanggilan menunjukkan fleksibilitas parameter: lambda buatan, lambda dari factory, bahkan lambda identitas harga => harga untuk kondisi tanpa diskon.

Factory diskon dan parameter transformasi adalah dua arah higher-order: satu menghasilkan method, satu menerima method. Keduanya dapat dirangkai, misalnya hasil BuatDiskon langsung dikirim ke TampilkanHarga tanpa variabel perantara. Pola ini juga yang dipakai API logging dan konfigurasi di .NET.