Sub dan Function

Perbedaan Sub sebagai pernyataan dan Function yang mengembalikan nilai.

Daftar isi

Prosedur adalah blok kode yang diberi nama dan dapat dipanggil berulang kali dari bagian lain program. VB.NET menyediakan dua jenis prosedur yang paling sering digunakan, yaitu Sub dan Function. Topik ini membahas cara mendeklarasikan keduanya, perbedaan perilakunya, cara memanggilnya, serta aturan tanda kurung yang berlaku pada pemanggilan. Setelah membacanya, program yang tadinya berupa satu daftar pernyataan panjang dapat dipecah menjadi prosedur-prosedur pendek dengan tugas yang jelas.

Sub tanpa nilai kembalian#

Sub adalah prosedur yang menjalankan serangkaian pernyataan tanpa mengembalikan nilai ke pemanggilnya. Deklarasinya dibuka dengan pernyataan Sub, ditutup dengan End Sub, dan parameternya dituliskan di antara tanda kurung. Sub cocok untuk aksi yang selesai dengan sendirinya, misalnya mencetak laporan ke layar atau menuliskan berkas, karena hasil kerjanya langsung tampak tanpa perlu dikirim balik.

vb Contoh: Sub untuk mencetak laporan nilai
' tidak-dijalankan
Sub CetakLaporan(nama As String, nilaiSatu As Double, nilaiDua As Double, nilaiTiga As Double)
    Console.WriteLine($"Laporan nilai: {nama}")
    Console.WriteLine($"Nilai 1: {nilaiSatu}")
    Console.WriteLine($"Nilai 2: {nilaiDua}")
    Console.WriteLine($"Nilai 3: {nilaiTiga}")
End Sub

' pemanggilan sebagai pernyataan
CetakLaporan("Ali", 80, 90, 100)

Prosedur CetakLaporan menerima empat parameter dan menuliskan isinya ke console. Pemanggilannya berupa satu pernyataan yang berdiri sendiri, sehingga kendali langsung kembali ke pemanggil setelah pernyataan terakhir selesai dijalankan. Tidak ada nilai yang dikirim balik, dan memang begitulah tempat Sub berada, yaitu pada aksi yang tidak memerlukan hasil.

Nama prosedur mengikuti konvensi PascalCase seperti tipe lainnya, dan kalimat kerjanya dibaca sebagai aksi, misalnya CetakLaporan berarti laporan dicetak. Daftar parameternya boleh kosong bila prosedurnya memang tidak memerlukan masukan, misalnya Sub CetakGaris() yang hanya menuliskan garis pemisah. Sebaliknya, bila tugasnya menghasilkan nilai yang perlu ditampung pemanggil, Sub bukan wadah yang tepat dan deklarasinya perlu dipindahkan ke Function pada bagian berikutnya.

Function dengan nilai kembalian#

Function adalah prosedur yang mengembalikan satu nilai ke pemanggilnya melalui pernyataan Return. Tipe nilai kembalian dideklarasikan dengan klausa As di akhir baris Function, misalnya As Double menjanjikan hasil berupa bilangan pecahan. Karena menghasilkan nilai, Function dipanggil di dalam ekspresi, misalnya di sebelah kanan penugasan atau di dalam argumen prosedur lain.

vb Contoh: Function yang menghitung rata-rata
' tidak-dijalankan
Function HitungRataRata(nilaiSatu As Double, nilaiDua As Double, nilaiTiga As Double) As Double
    Return (nilaiSatu + nilaiDua + nilaiTiga) / 3
End Function

Perhatikan baris Return (nilaiSatu + nilaiDua + nilaiTiga) / 3. Pernyataan itu menghitung rata-rata tiga nilai sekaligus mengembalikan kendali ke pemanggil. VB.NET juga mengizinkan cara kedua, yaitu mengisi nilai ke nama fungsinya sendiri, misalnya HitungRataRata = total, dan kendali baru kembali ketika End Function tercapai. Cara pertama dengan Return lebih ringkas dan menjadi gaya yang lazim digunakan.

Nilai kembalian juga dapat langsung menjadi argumen prosedur lain, misalnya Console.WriteLine(HitungRataRata(80, 90, 100)), tanpa variabel penengah. Pilihlah nama yang menyatakan hasilnya, sehingga kalimat pemanggilnya terbaca sebagai satu perhitungan yang lengkap. Dengan kebiasaan itu, pembaca kode mengetahui sifat prosedurnya dari namanya sebelum membaca badannya.

Menyusun keduanya dalam satu program#

Program berikut menggabungkan kedua jenis prosedur untuk membuat laporan nilai ujian. Sub CetakLaporan menangani pencetakan, sedangkan Function HitungRataRata menangani perhitungan yang hasilnya digunakan di dalam pencetakan tersebut. Simpan berkasnya, jalankan dengan perintah dotnet run dari folder proyek console, dan bandingkan keluarannya dengan yang tertulis di bawah.

vb LaporanNilai.vb
Module Program
    Sub CetakLaporan(nama As String, nilaiSatu As Double, nilaiDua As Double, nilaiTiga As Double)
        Console.WriteLine($"Laporan nilai: {nama}")
        Console.WriteLine($"Nilai 1: {nilaiSatu}")
        Console.WriteLine($"Nilai 2: {nilaiDua}")
        Console.WriteLine($"Nilai 3: {nilaiTiga}")
        Console.WriteLine($"Rata-rata: {HitungRataRata(nilaiSatu, nilaiDua, nilaiTiga)}")
        Console.WriteLine()
    End Sub

    Function HitungRataRata(nilaiSatu As Double, nilaiDua As Double, nilaiTiga As Double) As Double
        Return (nilaiSatu + nilaiDua + nilaiTiga) / 3
    End Function

    Sub Main()
        CetakLaporan("Ali", 80, 90, 100)
        CetakLaporan("Citra", 75, 85, 95)
    End Sub
End Module
text Keluaran
Laporan nilai: Ali
Nilai 1: 80
Nilai 2: 90
Nilai 3: 100
Rata-rata: 90

Laporan nilai: Citra
Nilai 1: 75
Nilai 2: 85
Nilai 3: 95
Rata-rata: 85

Bagian Sub Main memanggil CetakLaporan dua kali dengan data peserta yang berbeda. Di dalam pencetakan, rata-rata diperoleh dengan memanggil HitungRataRata langsung di dalam string interpolasi, sehingga nilai kembaliannya langsung digunakan tanpa variabel tambahan. Pola pembagian kerja seperti ini memudahkan pengujian, karena perhitungan dapat diperiksa terlebih dahulu tanpa memperhatikan bentuk keluarannya. Urutan deklarasi di dalam Module juga bebas, karena compiler membaca seluruh modul sebelum program dijalankan, sehingga CetakLaporan boleh memanggil HitungRataRata yang dideklarasikan sesudahnya. Dari Sub Main sebagai titik masuk, panggilan ke prosedur lain berantai sesuai kebutuhan laporannya. Diagram berikut merangkum alur kedua jenis pemanggilan itu, yaitu Sub yang hanya kembali dan Function yang kembali disertai nilai.

Alur pemanggilan Sub dan FunctionSub (pernyataan)PemanggilSub CetakLaporandipanggilkendali kembaliTanpa nilai kembalianFunction (nilai kembalian)PemanggilFunction HitungRataRatadipanggilkendali + nilaiKendali kembali disertai nilai
Alur pemanggilan Sub dan Function

Aturan tanda kurung pada pemanggilan#

Tanda kurung pada pemanggilan prosedur mengikuti konteks pemanggilannya, bukan selera penulisnya. Aturannya dirangkum dalam tabel berikut.

Bentuk pemanggilanTanda kurung
Function dipanggil di dalam ekspresi dengan argumenwajib mengapit daftar argumen
Function dipanggil di dalam ekspresi tanpa argumenboleh dihilangkan
Sub atau Function dipanggil sebagai pernyataanboleh digunakan dan disarankan
Sub dipanggil sebagai pernyataan tanpa argumenboleh dihilangkan

Aturan yang paling sering menimbulkan masalah adalah baris pertama tabel. Pemanggilan Dim rata = HitungRataRata(80, 90, 100) sah karena tanda kurungnya ada, sedangkan bentuk tanpa tanda kurung di posisi ekspresi ditolak compiler. Untuk pemanggilan sebagai pernyataan, VB.NET menerima bentuk dengan maupun tanpa tanda kurung, tetapi dokumentasi resmi menyarankan tanda kurung tetap digunakan agar kode lebih mudah dibaca. Kata kunci Call juga masih tersedia untuk memanggil Sub sebagai pernyataan, misalnya Call CetakLaporan("Ali", 80, 90, 100), meskipun gaya modern lazim meninggalkannya.

vb Contoh: pemanggilan yang sah dan yang ditolak
' tidak-dijalankan
Dim rata As Double = HitungRataRata(80, 90, 100)  ' sah: kurung mengapit argumen
CetakLaporan("Budi", 70, 80, 90)                  ' sah: Sub sebagai pernyataan
' Dim gagal As Double = CetakLaporan("Budi", 70, 80, 90) ' ditolak: Sub tidak menghasilkan nilai
' Dim salah As Double = HitungRataRata 80, 90, 100       ' ditolak: kurung wajib di posisi ekspresi

Kesalahan umum#

Kesalahan pertama adalah menggunakan Sub untuk perhitungan, lalu mencoba menampung “hasilnya” ke dalam variabel. Compiler menolaknya karena Sub tidak menghasilkan nilai apa pun. Perbaikannya jelas, yaitu mengubah deklarasinya menjadi Function dengan klausa As dan mengembalikan hasilnya lewat Return.

Kesalahan kedua adalah Function yang alur cabangnya tidak semua bermuara pada Return. Misalnya percabangan If yang hanya satu sisi memuat Return, sehingga jalur lain lolos sampai End Function dan menghasilkan nilai default secara diam-diam. Jejak bugnya berupa angka 0 atau Nothing yang muncul tanpa pesan error. Pastikan setiap jalur eksekusi mengembalikan nilai, atau tuliskan satu pernyataan Return terakhir sebagai penutup.

Kesalahan ketiga adalah memanggil Function sebagai pernyataan lalu mengharapkan hasilnya tersimpan. Baris HitungRataRata(80, 90, 100) yang berdiri sendiri sah menurut compiler, tetapi seluruh perhitungannya dibuang begitu saja karena tidak ada penampung. Bila hasilnya memang tidak digunakan, panggilan seperti itu menyesatkan pembaca kode, sehingga sebaiknya dituliskan penugasannya atau diubah menjadi Sub yang tugasnya murni aksi.

Ringkasan#

  • Sub menjalankan pernyataan tanpa nilai kembalian, sedangkan Function mengembalikan satu nilai sesuai tipe yang dideklarasikan pada klausa As, biasanya melalui pernyataan Return.
  • Pemanggilan di dalam ekspresi wajib menggunakan tanda kurung di sekitar daftar argumen, sedangkan pemanggilan sebagai pernyataan bebas dengan atau tanpa tanda kurung, dan penggunaannya tetap menjadi gaya yang disarankan.
  • Pecahkan program menjadi prosedur pendek dengan tugas tunggal, yaitu Sub untuk aksi dan Function untuk perhitungan yang hasilnya digunakan pemanggil.

Referensi#