Blogroll

Kamis, 11 Juni 2015

Mengenal Delegate pada C#

Baiklah pada postingan kali ini, penulis ingin memberitahukan alasan mengapa memutuskan untuk menulis tutorial mengenai delegate. Jawabnya cukup mudah, penulis 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.

Kalkulator

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 input-an mereka, misalkan jika program kalkulator ini dipanggil :
?
1
Kalkulator.exe  3 + 4
Ketika perintah itu dijalankan melalu console akan keluar hasil berupa :
?
1
Kalkulator.exe  3 + 4
Project Kalkulator
Contoh Project Kalkulator yang akan Mendemokan Delegate pada C#
Untuk membuatnya, pertama buka VisualStudio, pilihan C#, dan buat project untuk membuat Console Application.
Console Application
Membuat Project Console Application

Tambahkan beberapa fungsi matematika sederhana dalam class Program, sebagai berikut :
?
1
2
3
static int Tambah(int a, int b)
 
{ return a + b; }
?
1
2
3
static int Kurang(int a, int b)
 
{ return a - b; }
?
1
2
3
static int Bagi(int a, int b)
 
{ return a / b; }
?
1
2
3
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 :
?
1
2
3
4
5
6
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 :
?
1
2
3
4
5
6
7
8
9
10
11
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 :
?
1
2
3
4
5
6
7
8
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 ? Kenapa ia dapat menerima fungsi sebagai nilainya ?
Tanpa diragukan lagi, MathFunction adalah DELEGATE. Delegate tersebut dideklarasikan sebagai berikut:
?
1
delegate int MathFunction(int a, int b);<em>&nbsp;</em>
Delegate tersebut dibuat dengan rumus sebagai berikut :
?
1
Delegate <return variable type><nama delegate>(<functions parameter>);
Dengan melihat contoh di atas sekiranya anda telah mendapat gambaran mengenai apa itu delegate pada C#.
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.
?
1
int hasil = mathFunction(kiri, kanan);
Berikut adalah kode lengkap dari program di atas :
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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.

0 komentar:

Posting Komentar