Modularisasi, Fungsi, Rekursi, dan Penanganan Kesalahan dalam Pemrograman
Pada Pertemuan 10 Koding dan Kecerdasan Artifisial (KKA) Kelas XI, kita akan mempelajari bagaimana membuat program yang lebih terstruktur, mudah digunakan kembali, lebih mudah diuji, dan lebih siap dikembangkan.
Materi tidak berhenti pada pengertian fungsi atau jenis-jenis error. Kita akan bekerja seperti seorang programmer ketika membangun aplikasi: memecah masalah menjadi bagian-bagian kecil, membuat fungsi, mengatur parameter dan nilai balik, memahami scope, menggunakan rekursi secara terbatas, serta menangani kesalahan agar program tidak mudah berhenti ketika menerima input yang tidak sesuai.
1. Apa yang Dipelajari pada Pertemuan 10?
Pertemuan 10 merupakan bagian dari Bab 3 - Algoritma Pemrograman Tingkat Lanjut. Fokus pembelajarannya adalah:
- Parameter
- Return value
- Scope
- Dekomposisi atau modularisasi program
- Rekursi terbatas
- Exception atau error handling
- Kontrak fungsi
2. Mengapa Programmer Menggunakan Modularisasi?
Bayangkan sebuah aplikasi kasir memiliki 2.000 baris kode dalam satu file. Di dalamnya terdapat kode untuk login, menghitung harga, mencetak struk, menghitung diskon, menyimpan data pelanggan, dan membuat laporan.
Jika semuanya ditulis dalam satu blok besar, programmer akan kesulitan memahami, menguji, dan memperbaiki program tersebut.
Karena itu program biasanya dipecah menjadi beberapa bagian atau modul. Setiap bagian memiliki tugas tertentu.
Contoh pembagian program kasir
| Modul/Fungsi | Tugas |
|---|---|
| hitung_total() | Menghitung total belanja |
| hitung_diskon() | Menghitung potongan harga |
| hitung_pajak() | Menghitung pajak |
| cetak_struk() | Mencetak informasi transaksi |
Inilah salah satu ide utama modularisasi: sebuah masalah besar dipecah menjadi bagian-bagian yang lebih kecil dan memiliki tanggung jawab yang jelas.
3. Apa Itu Fungsi?
Fungsi adalah blok kode yang dibuat untuk menjalankan tugas tertentu dan dapat dipanggil ketika diperlukan.
Dalam Python, fungsi dibuat menggunakan kata kunci
def.
def sapa():
print("Halo, selamat belajar!")
Fungsi tersebut belum dijalankan hanya karena dibuat. Kita perlu memanggilnya.
sapa()
Hasil:
Halo, selamat belajar!
4. Parameter pada Fungsi
Fungsi dapat menerima data dari luar. Data tersebut dapat diterima melalui parameter.
def sapa(nama):
print("Halo", nama)
sapa("Andi")
sapa("Siti")
Pada contoh tersebut, nama adalah parameter.
Nilai "Andi" dan "Siti" merupakan argumen
yang diberikan ketika fungsi dipanggil.
Contoh fungsi dengan dua parameter
def luas_persegi_panjang(panjang, lebar):
luas = panjang * lebar
print("Luas =", luas)
luas_persegi_panjang(10, 5)
Hasil:
Luas = 50
5. Return Value
Fungsi tidak selalu hanya menampilkan hasil menggunakan
print(). Fungsi juga dapat mengembalikan nilai menggunakan
return.
def luas_persegi_panjang(panjang, lebar):
return panjang * lebar
hasil = luas_persegi_panjang(10, 5)
print("Luas =", hasil)
Perbedaan penting:
| print() | return |
|---|---|
| Menampilkan sesuatu ke layar | Mengembalikan nilai kepada bagian program yang memanggil fungsi |
| Cocok untuk output langsung | Cocok ketika hasil masih akan diproses |
Contoh dalam aplikasi
def hitung_total(harga, jumlah):
return harga * jumlah
subtotal = hitung_total(15000, 3)
diskon = 5000
total = subtotal - diskon
print("Total pembayaran:", total)
Dalam aplikasi nyata, return value sangat berguna karena hasil sebuah fungsi dapat digunakan oleh fungsi lainnya.
6. Scope Variabel
Scope berkaitan dengan wilayah atau bagian program tempat sebuah variabel dapat digunakan.
Local variable
Variabel yang dibuat di dalam fungsi biasanya hanya digunakan di dalam fungsi tersebut.
def hitung():
nilai = 100
print(nilai)
hitung()
Variabel nilai berada dalam scope fungsi
hitung().
Contoh kesalahan scope
def hitung():
nilai = 100
hitung()
print(nilai)
Program tersebut bermasalah karena nilai dibuat
di dalam fungsi dan tidak tersedia begitu saja di luar scope tersebut.
7. Modularisasi Program
Modularisasi berarti membagi program menjadi bagian-bagian yang memiliki tugas tertentu.
Contoh program yang kurang modular
harga = 50000
jumlah = 3
subtotal = harga * jumlah
if subtotal >= 100000:
diskon = 10000
else:
diskon = 0
total = subtotal - diskon
print("Subtotal:", subtotal)
print("Diskon:", diskon)
print("Total:", total)
Program tersebut masih dapat berjalan, tetapi ketika aplikasi semakin besar, kode seperti ini akan lebih sulit dirawat.
Versi modular
def hitung_subtotal(harga, jumlah):
return harga * jumlah
def hitung_diskon(subtotal):
if subtotal >= 100000:
return 10000
return 0
def hitung_total(subtotal, diskon):
return subtotal - diskon
harga = 50000
jumlah = 3
subtotal = hitung_subtotal(harga, jumlah)
diskon = hitung_diskon(subtotal)
total = hitung_total(subtotal, diskon)
print("Subtotal:", subtotal)
print("Diskon:", diskon)
print("Total:", total)
Sekarang setiap fungsi mempunyai tanggung jawab yang lebih jelas.
Jika aturan diskon berubah, programmer dapat fokus pada fungsi
hitung_diskon().
8. Kontrak Fungsi
Kontrak fungsi adalah kesepakatan mengenai bagaimana sebuah fungsi digunakan dan apa yang diharapkan dari fungsi tersebut.
Secara sederhana, kontrak fungsi dapat menjelaskan:
- Data apa yang diterima?
- Data tersebut harus memiliki kondisi seperti apa?
- Apa hasil yang dikembalikan?
- Apa yang terjadi jika input tidak sesuai?
Contoh
def hitung_diskon(total):
"""
Kontrak:
- total harus berupa angka
- total tidak boleh negatif
- mengembalikan nilai diskon
"""
if total < 0:
raise ValueError("Total tidak boleh negatif")
if total >= 100000:
return 10000
return 0
Kontrak membuat perilaku fungsi lebih mudah dipahami oleh programmer lain.
9. Apa Itu Rekursi?
Rekursi adalah teknik ketika sebuah fungsi memanggil dirinya sendiri untuk menyelesaikan masalah yang dapat dipecah menjadi bentuk yang lebih kecil.
Rekursi membutuhkan base case atau kondisi berhenti. Tanpa kondisi berhenti, fungsi dapat terus memanggil dirinya sendiri.
Contoh faktorial
Faktorial 5 adalah:
5 × 4 × 3 × 2 × 1 = 120
Contoh implementasi:
def faktorial(n):
if n == 0:
return 1
return n * faktorial(n - 1)
print(faktorial(5))
Hasil:
120
Bagaimana prosesnya?
faktorial(5)
= 5 × faktorial(4)
= 5 × 4 × faktorial(3)
= 5 × 4 × 3 × faktorial(2)
= 5 × 4 × 3 × 2 × faktorial(1)
= 5 × 4 × 3 × 2 × 1 × faktorial(0)
= 120
10. Apa Itu Error dan Exception?
Dalam pekerjaan programmer, kesalahan program merupakan sesuatu yang perlu ditemukan, dipahami, dan ditangani.
Salah satu situasi yang umum terjadi adalah program menerima input yang tidak sesuai.
Contoh masalah
umur = int(input("Masukkan umur: "))
print("Umur:", umur)
Jika pengguna memasukkan:
dua puluh
program dapat mengalami exception karena teks tersebut tidak dapat langsung dikonversi menjadi integer.
11. Exception Handling dengan try dan except
Python menyediakan mekanisme penanganan exception menggunakan
try dan except.
try:
umur = int(input("Masukkan umur: "))
print("Umur:", umur)
except ValueError:
print("Input harus berupa angka.")
Dengan demikian, program dapat memberikan pesan yang lebih ramah ketika input pengguna tidak sesuai.
Contoh pembagian
try:
angka1 = int(input("Angka pertama: "))
angka2 = int(input("Angka kedua: "))
hasil = angka1 / angka2
print("Hasil:", hasil)
except ValueError:
print("Masukkan harus berupa angka.")
except ZeroDivisionError:
print("Angka kedua tidak boleh nol.")
Di sini programmer menangani dua kemungkinan kesalahan berbeda.
12. Mengapa Error Handling Penting di Dunia Kerja?
Dalam aplikasi nyata, pengguna tidak selalu memberikan input sesuai harapan programmer.
Contohnya:
- Pengguna memasukkan huruf ketika sistem meminta angka.
- Jumlah barang bernilai negatif.
- Data yang dicari tidak ditemukan.
- File tidak tersedia.
- Nilai tertentu tidak valid.
- Operasi matematika tidak dapat dilakukan.
Karena itu programmer perlu merancang program agar kesalahan dapat ditangani dengan jelas.
13. Praktik Industri: Membuat Modul Kasir Sederhana
Simulasi pekerjaan programmer
Kamu berperan sebagai junior programmer yang mendapatkan tugas memperbaiki modul perhitungan transaksi pada aplikasi kasir.
Programmer sebelumnya membuat seluruh proses dalam satu blok kode. Tugasmu adalah melakukan refactoring sederhana dengan menerapkan fungsi, parameter, return value, validasi input, scope yang jelas, dan error handling.
Kasus
Sebuah toko membutuhkan program sederhana untuk menghitung transaksi. Program harus:
- Menerima nama produk.
- Menerima harga produk.
- Menerima jumlah produk.
- Menghitung subtotal.
- Memberikan diskon jika memenuhi syarat.
- Menghitung total pembayaran.
- Menangani input yang tidak valid.
14. Tahap 1: Membuat Fungsi Validasi
def validasi_harga(harga):
if harga <= 0:
raise ValueError("Harga harus lebih dari 0")
return harga
def validasi_jumlah(jumlah):
if jumlah <= 0:
raise ValueError("Jumlah harus lebih dari 0")
return jumlah
Sekarang validasi tidak perlu ditulis berulang-ulang di seluruh program. Kita sudah membuat fungsi khusus.
15. Tahap 2: Membuat Fungsi Perhitungan
def hitung_subtotal(harga, jumlah):
return harga * jumlah
def hitung_diskon(subtotal):
if subtotal >= 500000:
return subtotal * 0.10
return 0
def hitung_total(subtotal, diskon):
return subtotal - diskon
Setiap fungsi memiliki satu tugas utama.
16. Tahap 3: Menggabungkan Modul
def validasi_harga(harga):
if harga <= 0:
raise ValueError("Harga harus lebih dari 0")
return harga
def validasi_jumlah(jumlah):
if jumlah <= 0:
raise ValueError("Jumlah harus lebih dari 0")
return jumlah
def hitung_subtotal(harga, jumlah):
return harga * jumlah
def hitung_diskon(subtotal):
if subtotal >= 500000:
return subtotal * 0.10
return 0
def hitung_total(subtotal, diskon):
return subtotal - diskon
try:
nama_produk = input("Nama produk: ")
harga = float(input("Harga produk: "))
jumlah = int(input("Jumlah produk: "))
harga = validasi_harga(harga)
jumlah = validasi_jumlah(jumlah)
subtotal = hitung_subtotal(harga, jumlah)
diskon = hitung_diskon(subtotal)
total = hitung_total(subtotal, diskon)
print("\n=== STRUK TRANSAKSI ===")
print("Produk :", nama_produk)
print("Harga :", harga)
print("Jumlah :", jumlah)
print("Subtotal :", subtotal)
print("Diskon :", diskon)
print("Total :", total)
except ValueError as error:
print("Transaksi gagal:", error)
17. Menguji Program Seperti Programmer di Industri
Program belum dianggap selesai hanya karena dapat dijalankan. Kita perlu mengujinya dengan beberapa kondisi.
| No. | Skenario | Input | Hasil yang Diharapkan |
|---|---|---|---|
| 1 | Kondisi normal | Harga 20.000, jumlah 3 | Subtotal 60.000 dan transaksi berhasil |
| 2 | Mendapat diskon | Harga 200.000, jumlah 3 | Diskon 10% diterapkan |
| 3 | Harga tidak valid | Harga -10.000 | Program menolak input |
| 4 | Jumlah tidak valid | Jumlah 0 | Program menolak input |
| 5 | Input bukan angka | Harga "dua puluh" | Program menampilkan pesan kesalahan |
18. Praktik Rekursi: Menghitung Total Struktur Data
Untuk memahami rekursi secara lebih nyata, kita dapat menggunakan contoh sederhana berupa penjumlahan angka.
def jumlah_sampai(n):
if n == 0:
return 0
return n + jumlah_sampai(n - 1)
print(jumlah_sampai(5))
Hasil:
15
Prosesnya:
5 + jumlah_sampai(4)
4 + jumlah_sampai(3)
3 + jumlah_sampai(2)
2 + jumlah_sampai(1)
1 + jumlah_sampai(0)
0
Setelah mencapai 0, fungsi berhenti dan hasil dikembalikan
melalui rangkaian pemanggilan sebelumnya.
19. Kesalahan Umum Saat Membuat Fungsi
Kesalahan 1: Tidak menggunakan return
def tambah(a, b):
hasil = a + b
print(hasil)
nilai = tambah(10, 20)
Fungsi hanya mencetak hasil, bukan mengembalikan hasil untuk digunakan oleh bagian program lain.
Kesalahan 2: Tidak memvalidasi input
def hitung_total(harga, jumlah):
return harga * jumlah
Fungsi tersebut belum memastikan apakah harga dan jumlah masuk akal.
Kesalahan 3: Rekursi tanpa kondisi berhenti
def hitung(n):
return hitung(n - 1)
Fungsi tersebut tidak mempunyai base case sehingga tidak memiliki kondisi berhenti yang benar.
Kesalahan 4: Menangani semua error secara sembarangan
try:
...
except:
print("Terjadi error")
Penanganan seperti ini terlalu umum karena programmer kehilangan informasi mengenai jenis kesalahan yang sebenarnya terjadi. Sebisa mungkin tangani exception yang memang diketahui dan relevan.
20. Praktik Industri: Refactoring Program
Dalam pekerjaan pengembangan perangkat lunak, programmer sering kali tidak selalu membuat program dari halaman kosong. Programmer juga memperbaiki kode yang sudah ada.
Proses memperbaiki struktur kode tanpa mengubah tujuan utama program dikenal sebagai refactoring.
Tugas Simulasi
Guru memberikan sebuah program sederhana yang masih ditulis dalam satu blok kode.
Tugas siswa adalah mengubahnya menjadi program yang lebih modular.
Minimal harus memiliki:
- 3 fungsi atau lebih
- Parameter
- Return value
- Validasi input
- Minimal 1 penggunaan exception handling
- Scope variabel yang jelas
- Minimal 3 test case
- Dokumentasi singkat
21. Tugas Praktik Siswa
Judul Praktik
Refactoring Program Sederhana Menjadi Program Modular dengan Fungsi dan Error Handling
Skenario
Kamu bekerja sebagai junior programmer pada sebuah tim pengembang aplikasi sederhana untuk toko sekolah.
Tim membutuhkan program untuk menghitung transaksi pembelian. Program harus dapat menerima data barang, menghitung subtotal, menghitung diskon, menghitung total pembayaran, dan menangani input yang tidak valid.
Ketentuan
- Buat program menggunakan Python.
- Gunakan minimal 3 fungsi.
- Gunakan parameter pada fungsi.
- Gunakan return value.
- Terapkan validasi input.
- Gunakan
try-except. - Gunakan nama fungsi dan variabel yang mudah dipahami.
- Tambahkan komentar pada bagian penting.
- Lakukan minimal 3 pengujian.
- Catat hasil pengujian.
- Jelaskan bagian yang diperbaiki atau dimodularisasi.
Output yang Dikumpulkan
- File program Python.
- Screenshot program ketika berhasil dijalankan.
- Screenshot minimal satu kondisi error.
- Tabel hasil pengujian.
- Penjelasan fungsi yang dibuat.
- Refleksi singkat.
22. Format Laporan Praktik
| Bagian | Isi |
|---|---|
| Judul | Refactoring Program Transaksi |
| Tujuan | Menjelaskan tujuan pembuatan program dan modularisasi. |
| Masalah | Menjelaskan permasalahan pada program awal. |
| Solusi | Menjelaskan fungsi/modul yang dibuat. |
| Implementasi | Melampirkan kode program. |
| Pengujian | Melampirkan minimal tiga skenario pengujian. |
| Perbaikan | Menjelaskan bug atau masalah yang ditemukan. |
| Refleksi | Menjelaskan hal yang dipahami, kesulitan, dan perbaikan berikutnya. |
23. Contoh Jawaban Praktik
Berikut contoh salah satu solusi. Siswa tidak harus menghasilkan kode yang identik selama memenuhi kebutuhan dan kriteria praktik.
def validasi_harga(harga):
if harga <= 0:
raise ValueError("Harga harus lebih dari 0")
return harga
def validasi_jumlah(jumlah):
if jumlah <= 0:
raise ValueError("Jumlah harus lebih dari 0")
return jumlah
def hitung_subtotal(harga, jumlah):
return harga * jumlah
def hitung_diskon(subtotal):
if subtotal >= 500000:
return subtotal * 0.10
return 0
def hitung_total(subtotal, diskon):
return subtotal - diskon
try:
produk = input("Nama produk: ")
harga = float(input("Harga: "))
jumlah = int(input("Jumlah: "))
harga = validasi_harga(harga)
jumlah = validasi_jumlah(jumlah)
subtotal = hitung_subtotal(harga, jumlah)
diskon = hitung_diskon(subtotal)
total = hitung_total(subtotal, diskon)
print("\n=== HASIL TRANSAKSI ===")
print("Produk :", produk)
print("Subtotal :", subtotal)
print("Diskon :", diskon)
print("Total :", total)
except ValueError as error:
print("Transaksi gagal:", error)
24. Contoh Hasil Pengujian
| Skenario | Input | Expected Result | Actual Result | Status |
|---|---|---|---|---|
| Normal | 20.000 × 3 | Total 60.000 | Total 60.000 | PASS |
| Diskon | 200.000 × 3 | Diskon 60.000 | Diskon 60.000 | PASS |
| Harga negatif | -10.000 × 2 | Input ditolak | Input ditolak | PASS |
| Input teks | "dua puluh" | Error ditangani | Error ditangani | PASS |
25. Tantangan Pengayaan
Bagi siswa yang sudah menyelesaikan tugas utama, tambahkan fitur berikut:
- Program dapat menangani beberapa produk.
- Buat fungsi untuk menghitung total seluruh transaksi.
- Buat fungsi untuk menentukan kategori diskon.
- Tambahkan penanganan kesalahan untuk input kosong.
- Tambahkan fungsi untuk menampilkan ringkasan transaksi.
- Gunakan rekursi sederhana pada bagian yang sesuai dan jelaskan base case-nya.
26. Tantangan Debugging
Perbaiki kode berikut agar dapat bekerja dengan benar.
def hitung_total(harga, jumlah):
total = harga * jumlah
try:
harga = int(input("Harga: "))
jumlah = int(input("Jumlah: "))
hasil = hitung_total(harga, jumlah)
print("Total:", hasil)
except:
print("Terjadi kesalahan")
Pertanyaan
- Apa masalah pada fungsi
hitung_total()? - Mengapa hasil fungsi tersebut tidak dapat digunakan dengan benar?
- Bagaimana cara memperbaikinya menggunakan
return? - Apakah penggunaan
except:sudah tepat? Jelaskan. - Buat minimal dua test case untuk membuktikan perbaikanmu.
27. Refleksi Pembelajaran
Setelah praktik, jawab pertanyaan berikut menggunakan bukti dari proses pekerjaanmu.
- Apa manfaat memecah program menjadi beberapa fungsi?
- Apa perbedaan parameter dan return value?
- Apa yang dimaksud scope?
- Mengapa rekursi membutuhkan kondisi berhenti?
- Mengapa program perlu menangani exception?
- Bug atau kesalahan apa yang kamu temukan?
- Bagaimana cara kamu memperbaikinya?
- Bagaimana modularisasi membuat program lebih mudah dikembangkan?
- Bagian mana dari programmu yang paling perlu diperbaiki?
- Apa hubungan materi ini dengan pekerjaan programmer?
Refleksi 150–200 kata
Tuliskan pengalamanmu setelah menyelesaikan praktik. Jelaskan perubahan pemahamanmu, bukti bahwa program sudah diuji, kesalahan yang ditemukan, cara memperbaikinya, dan hal yang ingin kamu tingkatkan pada praktik berikutnya.
28. Checklist Sebelum Mengumpulkan
- ☐ Program dapat dijalankan.
- ☐ Program menggunakan fungsi.
- ☐ Fungsi memiliki parameter jika diperlukan.
- ☐ Fungsi menggunakan return value jika diperlukan.
- ☐ Scope variabel dipahami.
- ☐ Terdapat validasi input.
- ☐ Terdapat exception handling.
- ☐ Jika menggunakan rekursi, terdapat base case.
- ☐ Program diuji dengan minimal tiga skenario.
- ☐ Hasil aktual dicatat.
- ☐ Kesalahan yang ditemukan diperbaiki.
- ☐ Kode memiliki struktur yang mudah dibaca.
- ☐ Dokumentasi dan screenshot tersedia.
- ☐ Refleksi telah dibuat.
29. Ringkasan Pertemuan 10
| Konsep | Inti Pemahaman | Penerapan |
|---|---|---|
| Modularisasi | Membagi program menjadi bagian yang lebih terstruktur. | Membuat fungsi dengan tanggung jawab tertentu. |
| Parameter | Data yang diterima fungsi. | Mengirim input ke fungsi. |
| Return value | Nilai yang dikembalikan fungsi. | Menggunakan hasil fungsi untuk proses berikutnya. |
| Scope | Wilayah penggunaan variabel. | Mengelola variabel lokal dan global secara tepat. |
| Rekursi | Fungsi memanggil dirinya sendiri. | Masalah yang dapat dipecah menjadi bentuk lebih kecil. |
| Error handling | Menangani kondisi kesalahan secara terkontrol. | try, except, dan exception tertentu. |
| Kontrak fungsi | Kesepakatan input, output, dan kondisi fungsi. | Membuat fungsi lebih mudah dipahami dan digunakan. |
30. Kesimpulan
Modularisasi, fungsi, rekursi, dan penanganan kesalahan merupakan bagian penting dalam membangun program yang lebih terstruktur. Programmer tidak hanya dituntut membuat kode yang menghasilkan output, tetapi juga perlu membuat kode yang dapat dipahami, diuji, diperbaiki, dan dikembangkan.
Melalui praktik pada Pertemuan 10, siswa tidak hanya mempelajari apa itu fungsi, tetapi juga belajar bagaimana fungsi digunakan untuk membangun solusi nyata.
Pola kerjanya adalah:
Masalah
↓
Pecah menjadi bagian kecil
↓
Buat fungsi/modul
↓
Tentukan parameter dan return value
↓
Validasi input
↓
Tangani kemungkinan error
↓
Uji program
↓
Temukan bug
↓
Perbaiki
↓
Uji kembali
↓
Dokumentasikan hasil

0 Comments