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 #
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:
Baju batik: Rp216000
Baju batik: Rp180000
Baju batik: Rp240000Bedah Kode Baris per Baris #
Mari kita telaah kode di atas:
- Baris 1-4:
BuatDiskonadalah higher-order function pertama: return type-nyaFunc<int, int>. Setiap panggilan menghasilkan lambda baru yang mengingat nilaipersenlewat closure. - Baris 6-9:
TampilkanHargaadalah higher-order function kedua: parametertransformasibertipeFunc<int, int>. Method ini tidak tahu aturan diskon apa pun; ia hanya menerapkan method yang diterimanya. - Baris 11-12: Dua panggilan
BuatDiskonmenghasilkan dua strategi berbeda dari satu cetakan yang sama, masing-masing dengan closurepersensendiri. - Baris 14-16: Ketiga pemanggilan menunjukkan fleksibilitas parameter: lambda buatan, lambda dari factory, bahkan lambda identitas
harga => hargauntuk 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.