Senin, 15 November 2010

Generic In VB.NET

karena lagi seru2nya nobar bareng teman2 mengenai topik Generic dengan C++ yang bisa bikin mual karena penggunaan tanda * dan ** (a.k.a. Pointer).

berikut ini bentuk sederhananya dengan menggunakan bahasa pemrograman VB yang terdapat dalam .NET Platform.

berikut ini ceritanya:

misalkan kita ingin membuat fungsi untuk melakukan pertukaran data, dengan fungsi seperti berikut ini:

Sub Swap(ByRef a As Integer, ByRef b As Integer)
        Dim temp As Integer = a
        a = b
        b = temp
End Sub

fungsi diatas bisa kita gunakan untuk mempertukarkan 2 buah data yang bertipe integer. seperti contoh penggunaan berikut ini:

Dim a, b As Integer
a = 2
b = 5
Console.WriteLine("A = {0}, B = {1}", a, b)
Swap(a, b)
Console.WriteLine("A = {0}, B = {1}", a, b)

pertanyaannya, bagaimana jika kita ingin mempertukarkan data yang bertipe double, atau string ?. jika dengan pendekatan di atas, maka harus didefinisikan fungsi-fungsi yang sama yang bersesuaian dengan tipe data yang diinginkan (istilahnya: method overloading)

namun, untuk membuat proses tersebut menjadi lebih mudah, bisa digunakan Generic Method, sehingga definisi fungsi cukup dilakukan 1x saja, kemudian bisa digunakan untuk jenis tipe data apa saja.  berikut ini fungsi swap dalam bentuk Generic:

Sub SwapGeneric(Of T)(ByRef x1 As T, ByRef x2 As T)
        Dim temp As T = x1
        x1 = x2
        x2 = temp
End Sub

perhatikan perbedaan yang ada antara Swap dengan SwapGeneric, di SwapGeneric, fungsi tersebut tidak memberitahukan secara spesifik apa tipe data yang akan dipertukarkan, tapi dibuat Generic dengan menggunakan T yang nantinya T tersebut akan digantikan oleh tipe data yang diinginkan pada saat fungsi SwapGeneric ini digunakan. berikut ini contoh penggunaannya:

- mempertukarkan 2 buah data integer

Dim a, b As Integer
a = 2
b = 5
Console.WriteLine("A = {0}, B = {1}", a, b)
SwapGeneric(Of Integer)(a, b)
Console.WriteLine("A = {0}, B = {1}", a, b)


- mempertukarkan 2 buah data double

Dim c, d As Double
c = 10.2
d = 5.5
Console.WriteLine("C = {0}, D = {1}", c, d)
SwapGeneric(Of Double)(c, d)
Console.WriteLine("C = {0}, D = {1}", c, d)


- mempertukarkan 2 buah data string

Dim e, f As String
e = "Saya"
f = "Dia"
Console.WriteLine("E = {0}, F = {1}", e, f)
SwapGeneric(Of String)(e, f)
Console.WriteLine("E = {0}, F = {1}", e, f)

bisa dilihat, dengan fungsi yang sama, bisa digunakan untuk mempertukarkan data dengan tipe data apa saja. bahkan untuk class seperti yang ditunjukkan pada contoh berikut ini:

Dim p1 As New Point(10, 2)
Dim p2 As New Point(5, 6)
Console.WriteLine("Before:")
Console.WriteLine("P1 -> " & p1.ToString())
Console.WriteLine("P2 -> " & p2.ToString())
SwapGeneric(Of Point)(p1, p2)
Console.WriteLine("After:")
Console.WriteLine("P1 -> " & p1.ToString())
Console.WriteLine("P2 -> " & p2.ToString())

dengan definisi class Point adalah sebagai berikut:

Public Class Point
    Public Property X As Integer
    Public Property Y As Integer
    Public Sub New(ByVal x As Integer, ByVal y As Integer)
        Me.X = x
        Me.Y = y
    End Sub
    Public Overrides Function ToString() As String
        Return String.Format("X = {0}, Y = {1}", X, Y)
    End Function
End Class

selain membuat method Generic, kita juga bisa membuat class Generic, seperti contoh struktur data Stack Generic berikut ini:

Public Class StackGeneric(Of T)

    Dim data As New List(Of T)

    Public Sub New()
        data.Clear()
    End Sub

    Public Function Count() As Integer
        Return data.Count
    End Function

    Public Sub Push(ByVal s As T)
        data.Add(s)
    End Sub

    Public Function Pop() As T
        Dim s As T = data(data.Count - 1)
        data.RemoveAt(data.Count - 1)
        Return s
    End Function

    Public Function Top() As T
        Return data(data.Count - 1)
    End Function

End Class

sama seperti T pada method Generic, di sini T juga baru akan ditentukan tipe datanya nanti pada saat penggunaan. dan berikut ini contoh penggunaan dari class di atas:

‘ membuat object StackGeneric –> Of Integer
Dim stack1 As New StackGeneric(Of Integer)()

Console.WriteLine(stack1.Count())

stack1.Push(1)
stack1.Push(2)
stack1.Push(3)
stack1.Push(4)
stack1.Push(5)

Console.WriteLine(stack1.Count())

Console.WriteLine("Elemen Stack:")
While stack1.Count > 0
    Console.WriteLine(stack1.Pop())
End While

dan karena sifatnya yang Generic, kita juga bisa mendefinisikan stack of string seperti contoh berikut ini:

Dim stack2 As New StackGeneric(Of String)()
Console.WriteLine(stack2.Count())
stack2.Push("Satu")
stack2.Push("Dua")
stack2.Push("Tiga")
stack2.Push("Empat")
stack2.Push("Lima")
Console.WriteLine(stack2.Count())
Console.WriteLine("Elemen Stack:")
While stack2.Count > 0
    Console.WriteLine(stack2.Pop())
End While

 

ok, semoga bermanfaat.

Rgds
Adi

Sabtu, 06 November 2010

Demo Praktek - Program Membuat Menu Pesanan Makanan Pada Restoran

Program berikut ini ditulis dengan menggunakan VB 2010.

berikut ini screenshot rancangan form nya:

image

dan berikut ini tampilan sewaktu mode Run:

image

program sudah didesain sangat fleksibel, sehingga penambahan menu makanan, menu minuman dan menu bonus bisa dilakukan dengan mudah tanpa perlu banyak mengedit source code program. hal yang perlu dilakukan untuk setiap penambahan menu yang baru adalah:

1. penamaan terhadap kontrol checkbox nama menu, label harga, dan textbox jumlah pesanan baru tersebut.
format:
checkbox –> chkXXX
label –> lblXXX
textbox –> txtXXX

2. daftarkan pada jendela properties event pada event CheckedChanged untuk checkbox yang baru tersebut agar menggunakan event handler CheckedChanged yang sudah ada.
image

ok, source code program dapat didownload dari Sini.
semoga bermanfaat

Rgds
Adi