Friday, July 15, 2011

Apa itu Delegate di .NET ?

image_3Baiklah pada postingan kali ini, saya ingin sekali memberitahukan alasan mengapa saya memutuskan untuk menulis tutorial mengenai delegate. Jawabnya cukup mudah, saya menemukan bahwa banyak buku pemrograman C#, baik itu buku berbahasa Indonesia maupun berbahasa Inggris yang dijual di Amazon menjelaskan delegate dalam .NET secara amat dalam dan bagus, mulai dari event-handling sampai bagaimana caranya delegate terlibat dalam hal tersebut, anda dapat mencari buku – buku tersebut dalam ragam variasi. Sementara buku-buku tersebut mengesankan bahwa delegate dibuat semata hanya demi event-handling, buku-buku tersebut sangat kurang dalam menjelaskan apa sebenarnya dasar, tujuan dari delegate, karena event-handling bukanlah alasan fundamental mengapa delegate diciptakan.

Calculator

Delegate akan jauh lebih mudah dipahami apabila menggunakan contoh langsung. Berikut adalah contoh sebuah program kalkulator sederhana dalam C# . Kalkulator ini menggunakan command-line arguments sebagai inputan mereka, misalkan jika program kalkulator ini dipanggil :

 

Kalkulator.exe 3 + 4
 
Ketika perintah itu dijalankan melalu console akan keluar hasil berupa :
 
Hasil adalah : 7
 
image
 



Untuk membuatnya, pertama buka VisualStudio dan buat project untuk membuat Console Application kemudian tambahkan beberapa fungsi matematika sederhana dalam class Program, sebagai berikut :


 


static int Tambah(int a, int b)
        { return a + b; }
 
static int Kurang(int a, int b)
        { return a - b; }
 
static int Bagi(int a, int b)
        { return a / b; }
 
static int Kali(int a, int b)
        { return a * b; }



 


Inputan berasal dari command-line arguments yang tersimpan dalam array args. Tambahkan baris berikut dalam fungsi utama :


 

static void Main(string[] args)
{
int kiri = int.Parse(args[0]);
char operasi = char.Parse(args[1]);
int kanan = int.Parse(args[2]);
}

 


Delegates

baiklah, tidak ada yang spesial hingga kini. Sekarang kita akan menambahkan delegate. Tapi sebelumnya, perhatikan fungsi utama di atas, bagaimana kelanjutannya ?  secara gamblang, intuisi kita akan berkata seperti ini : 


int hasil;
            if (operasi == '+') 
                hasil = Tambah(kiri, kanan);
            else if (operasi == '-') 
                hasil = Kurang(kiri, kanan);
            else if (operasi == '*') 
                hasil = Kali(kiri, kanan);
            else 
                hasil = Bagi(kiri, kanan);
            Console.WriteLine(string.Format("Hasil adalah {0}", hasil));




Dan tidak ada yang salah dengan syntax di atas. Tetapi sekarang, kita akan menggunakan delegate. Delegate dapat dianggap sebagai suatu variabel yang mempu menampung sebuah fungsi dan memperlakukannya seperti variabel. Agak membingungkan memang, tapi lihat contoh berikut yang merupakan alternatif dari syntax di atas :
 
 MathFunction mathFunction;
 if (operasi == '+') mathFunction = Tambah;
 else if (operasi == '-') mathFunction = Kurang;
 else if (operasi == '*') mathFunction = Kali;
 else mathFunction = Bagi;
 
 int hasil = mathFunction(kiri, kanan);
 Console.WriteLine(string.Format("Hasil adalah {0}", hasil));
 
Ada yang aneh dengan syntax ini bukan ? mathFunction dapat menerima nilai berupa nama fungsi seperti variabel biasa dan dapat dipanggil layaknya fungsi!
 
Hasil dari syntax ini benar dan sama dengan syntax di atas. Jadi apakah MathFunction itu ? apakah itu class atau struct ? tapi dia koq bisa menerima variabel berupa nama fungsi ? 
 
Tanpa diragukan lagi, MathFunction adalah DELEGATE. Delegate tersebut dideklarasikan sebagai berikut :
delegate int MathFunction(int a, int b);


Delegate tersebut dibuat dengan rumus sebagai berikut :
delegate <type> Delegate’s Name (<functions parameter>,….);
 
Tetapi mengapa dalam MathFunction hanya terdapat 2 parameter ( int a dan int b ) ? Perhatikan keempat fungsi matematika di atas ( Tambah, Kurang, Kali, Bagi ) mereka memliki kesamaan bentuk, kesamaan parameter dan kesamaan hasil keluaran (int). Karena delegate ini ditujukan bagi mereka, maka delegate MathFunction harus mengikuti ‘template’ keempat fungsi tersebut. 
 
Dan cara penggunaannya adalah cukup dipanggil namanya tanpa tanda kurung ‘ () ’ dibelakang, agar fungsi tersebut tidak mengembalikan nilai. Dan cara pemanggilannya seperti fungsi biasa dengan menggunakan tanda kurung dan 2 parameter, seperti keempat fungsi di atas.
int hasil = mathFunction(kiri, kanan);

Berikut adalah kode lengkap dari program di atas :


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication1
{
    class Program
    {
        delegate int MathFunction(int a, int b);
        static void Main(string[] args)
        {
            int kiri = int.Parse(args[0]);
            char operasi = char.Parse(args[1]);
            int kanan = int.Parse(args[2]);
 
            MathFunction mathFunction;
            if (operasi == '+') mathFunction = Tambah;
            else if (operasi == '-') mathFunction = Kurang;
            else if (operasi == '*') mathFunction = Kali;
            else mathFunction = Bagi;
 
            int hasil = mathFunction(kiri, kanan);
            Console.WriteLine(string.Format("Hasil adalah {0}", hasil));
        }
        
        static int Tambah(int a, int b)
        { return a + b; }
        static int Kurang(int a, int b)
        { return a - b; }
        static int Bagi(int a, int b)
        { return a / b; }
        static int Kali(int a, int b)
        { return a * b; }
 
    }
}



Akhirnya, seperti yang sudah dibicarakan sebelumnya, variabel delegate mathFunction dideklarasikan untuk menampung fungsi , bukan angka, string, atau karakter seperti yang biasanya kita pergunakan . Dan dengan sedikit logika ( if-else ) kita menentukan fungsi apa yang seharusnya berada dalam mathFunction tersebut.


 


Kesimpulan


Sebenarnya konsep mengenai delegate bukan barang baru, dalam bahasa pemrograman lain, misal dalam JavaScript, kita dapat memasukkan nama fuction dalam variabel, tetapi karena JavaScript bukanlah Strongly-typed language seperti .NET, maka proses assigned fungsi dalam vbariabel dapat berlangsung tanpa perlu menyediakan struktur delegate seperti C# dan Visual Basic dari .NET.

4 comments: