Delegates: contoh, tips & trik

Pelajari delegates di C# untuk meningkatkan fleksibilitas kode dengan callback, event handling, dan eksekusi metode dinamis. Delegates memudahkan dalam pengelolaan kode yang kompleks, memungkinkan eksekusi metode secara dinamis, dan mengintegrasikan berbagai sistem tanpa perlu perubahan besar pada struktur kode. Delegates juga membantu dalam memisahkan logika bisnis dari implementasi spesifik, sehingga mempermudah pemeliharaan dan pengembangan lebih lanjut.

Apa Itu Delegate?

Sederhananya, delegate itu kayak remote TV. Dia bisa mengganti channel tanpa kita harus jalan ke TV dan tekan-tekan tombol di sana. Jadi, delegate ini bisa dibilang sebagai variabel yang bisa merujuk ke metode, bukan langsung memanggilnya.

Kenapa Perlu Delegate?

Delegate ini berguna banget buat:

  • Callback
  • Event handler
  • Eksekusi metode secara dinamis

Cara Pake Delegate

Biar lebih jelas, kita coba pake contoh sederhana nih:

using System;


namespace DelegatesExample
{
    // Mendeklarasikan delegate
    public delegate void GreetDelegate(string message);


    class Program
    {
        static void Main(string[] args)
        {
            // Membuat instance delegate dan mengikatnya dengan metode
            GreetDelegate greet = GreetUser;


            // Memanggil metode lewat delegate
            greet("Halo, teman-teman dotnet developer!");


            // Delegate dengan metode anonim
            GreetDelegate greetAnon = delegate (string msg)
            {
                Console.WriteLine(msg);
            };
            greetAnon("Selamat datang di dunia C#!");


            // Delegate dengan ekspresi lambda
            GreetDelegate greetLambda = msg => Console.WriteLine(msg);
            greetLambda("Mari kita belajar bersama!");


            Console.ReadLine();
        }


        static void GreetUser(string message)
        {
            Console.WriteLine(message);
        }
    }
}

Contoh delegate untuk callback

Anggaplah kita punya tiga sistem pembayaran: QRIS, Virtual Account, dan Bank Transfer. Berikut adalah contoh bagaimana menggunakan delegates untuk mengatur callback dari ketiga sistem tersebut:

using System;

namespace PaymentCallbackExample
{
    // Mendefinisikan delegate untuk callback
    public delegate void PaymentCallback(string message);

    class Program
    {
        static void Main(string[] args)
        {
            // Mengikat delegate dengan metode dari tiga sistem pembayaran
            PaymentCallback qrisCallback = QRISPayment;
            PaymentCallback vaCallback = VirtualAccountPayment;
            PaymentCallback bankTransferCallback = BankTransferPayment;

            // Memanggil metode melalui delegate
            ProcessPayment("QRIS", qrisCallback);
            ProcessPayment("Virtual Account", vaCallback);
            ProcessPayment("Bank Transfer", bankTransferCallback);

            Console.ReadLine();
        }

        // Metode untuk proses pembayaran dengan callback
        static void ProcessPayment(string paymentType, PaymentCallback callback)
        {
            // Simulasi pemrosesan pembayaran
            Console.WriteLine($"Memproses pembayaran melalui {paymentType}...");
            // Memanggil callback setelah pembayaran diproses
            callback($"Pembayaran melalui {paymentType} berhasil!");
        }

        // Metode callback untuk QRIS
        static void QRISPayment(string message)
        {
            Console.WriteLine($"[QRIS] {message}");
        }

        // Metode callback untuk Virtual Account
        static void VirtualAccountPayment(string message)
        {
            Console.WriteLine($"[Virtual Account] {message}");
        }

        // Metode callback untuk Bank Transfer
        static void BankTransferPayment(string message)
        {
            Console.WriteLine($"[Bank Transfer] {message}");
        }
    }
}

Penjelasan:

  • Mendefinisikan Delegate: Kita mendefinisikan delegate PaymentCallback yang akan menerima pesan sebagai parameter.
  • Membuat Metode Callback: Kita membuat tiga metode callback untuk QRIS, Virtual Account, dan Bank Transfer.
  • Proses Pembayaran: Metode ProcessPayment digunakan untuk memproses pembayaran dan memanggil callback setelah pembayaran selesai.
  • Mengikat Delegate: Kita mengikat delegate dengan metode yang sesuai untuk setiap sistem pembayaran dan memanggilnya melalui ProcessPayment.

Contoh multicast delegates untuk event handling

Kita bisa menggunakan multicast delegates untuk menjalankan beberapa metode sekaligus ketika sebuah event terjadi, seperti pembayaran QRIS berhasil. Berikut adalah contoh bagaimana kita bisa menggunakan multicast delegates untuk menyimpan detail transaksi ke database, menulis log, dan mengirim email ke pelanggan.

using System;

namespace MulticastDelegatesExample
{
    // Mendefinisikan delegate untuk event handler pembayaran
    public delegate void PaymentHandler(string message);

    class Program
    {
        static void Main(string[] args)
        {
            // Membuat instance delegate dan menggabungkan metode-metode yang akan dipanggil
            PaymentHandler paymentHandler = SaveTransactionDetails;
            paymentHandler += WriteLog;
            paymentHandler += SendEmailToCustomer;

            // Memanggil delegate untuk simulasi pembayaran berhasil
            ProcessPayment("QRIS", paymentHandler);

            Console.ReadLine();
        }

        // Metode untuk proses pembayaran
        static void ProcessPayment(string paymentType, PaymentHandler handler)
        {
            // Simulasi pemrosesan pembayaran
            Console.WriteLine($"Memproses pembayaran melalui {paymentType}...");
            // Memanggil delegate setelah pembayaran berhasil
            handler($"Pembayaran melalui {paymentType} berhasil!");
        }

        // Metode untuk menyimpan detail transaksi ke database
        static void SaveTransactionDetails(string message)
        {
            Console.WriteLine("[Database] Menyimpan detail transaksi: " + message);
            // Logika penyimpanan ke database di sini
        }

        // Metode untuk menulis log
        static void WriteLog(string message)
        {
            Console.WriteLine("[Log] Mencatat log: " + message);
            // Logika pencatatan log di sini
        }

        // Metode untuk mengirim email ke pelanggan
        static void SendEmailToCustomer(string message)
        {
            Console.WriteLine("[Email] Mengirim email ke pelanggan: " + message);
            // Logika pengiriman email di sini
        }
    }
}

Penjelasan

  • Definisi Delegate: Kita mendefinisikan delegate PaymentHandler untuk event handler pembayaran.
  • Multicast Delegate: Kita membuat instance PaymentHandler dan menambahkan beberapa metode ke dalamnya menggunakan operator +=.
  • Proses Pembayaran: Metode ProcessPayment digunakan untuk memproses pembayaran dan memanggil delegate setelah pembayaran berhasil.
  • Metode Callback: Kita mendefinisikan tiga metode callback: SaveTransactionDetails untuk menyimpan detail transaksi ke database, WriteLog untuk mencatat log, dan SendEmailToCustomer untuk mengirim email ke pelanggan.

Tips dan Trik

  1. Callback: Delegates cocok banget buat callback, terutama buat API asynchronous.
  2. Anonim dan Lambda: Gunakan metode anonim dan ekspresi lambda biar kodenya ringkas dan gampang dibaca.
  3. Multicast Delegates: Delegates bisa manggil beberapa metode sekaligus, cocok buat event handling.
  4. Action dan Func: Action<T> dan Func<T, TResult> berguna buat delegasi dengan parameter dan nilai pengembalian. Ini bisa nyederhanain deklarasi delegate.
Action<string> greet = msg => Console.WriteLine(msg);
greet("Hello World dengan Action!");

Func<int, int, int> add = (a, b) => a + b;
Console.WriteLine(add(5, 3)); // Output: 8

Penutup

Delegates ini bikin kode kita jadi lebih fleksibel dan modular. Dengan ngerti dan ngegunain delegates, kita bisa nulis kode yang lebih rapi dan reusable. Jadi, ayo terus eksperimen dan praktekin apa yang udah kita pelajarin. Selamat belajar, bro dan sis! Kalau ada yang mau ditanya atau topik lain yang pengen dibahas, tinggal mention aja. Sampai ketemu di obrolan berikutnya!