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 |
Untuk membuatnya, pertama buka VisualStudio, pilihan C#, dan buat project untuk membuat 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 ConsoleApplication 1 { 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