Fungsi dengan kontrak yang dapat diuji
INFO9-09
Menulis fungsi yang memeriksa masukan sebelum menghasilkan nilai atau menolak keadaan invalid.
Bekal awal: Memahami fungsi, parameter, return, dan kondisi Python.
Konteks bab
Ketelitian memeriksa pekerjaan menjadi bentuk amanah. Program dan data digunakan sebagai contoh, tanpa akun atau transaksi nyata.
Bacaan dan kasus
3 · Program yang selalu tampak berhasil
Bacaan pendalaman
Kasus dan angka yang dibuat untuk latihan adalah simulasi/rekaan; fakta konsep dan sumber dibedakan dalam uraian.
Fungsi model menerima total8 dan dipinjam3. Pembuat berharap sisa5, tetapi kode menjumlahkan keduanya sehingga keluar11. Karena program tidak berhenti dengan pesan kesalahan, hasil semula dianggap benar. Pemeriksa kemudian meminta kontrak dan hitungan manual.
Perbaikan pertama mengganti penjumlahan dengan pengurangan. Uji8,3 lulus, tetapi data2,5 menghasilkan−3. Kelompok menyadari perhitungan benar belum cukup tanpa validasi. Mereka menambahkan pemeriksaan rentang serta kasus0,0 dan pinjam=total.
Laporan uji mencatat data, harapan, aktual, dan alasan. Kelompok tidak mengubah harapan5 menjadi11 agar semua tampak lulus. Mereka menyimpan versi awal untuk menjelaskan perubahan. Bukti belajar muncul dari kemampuan menemukan hubungan antara kontrak, bug, perbaikan, dan hasil uji.
Fokus pemeriksaan. Mengapa program yang selesai berjalan masih dapat salah?
Fungsi memisahkan satu tanggung jawab
Fungsi tersedia(total, dipinjam) menghitung sisa menurut kontrak. Ia tidak perlu sekaligus membaca formulir, menyimpan berkas, dan menggambar grafik. Pemisahan membuat perilaku lebih mudah diuji. Parameter ialah nama masukan pada definisi; argumen ialah nilai yang diberikan ketika fungsi dipanggil. return mengirim nilai ke pemanggil, berbeda dari print yang menampilkan teks.
Prasyarat dan hasil perlu jelas
Fungsi menerima dua bilangan bulat dengan 0≤dipinjam≤total. Setelah berhasil, hasil berada pada rentang0 sampai total. Masukan invalid ditolak sebelum hitungan dianggap sah. Pada contoh, ValueError dipakai untuk menandai kontrak tidak terpenuhi. Pemanggil dapat menangani kesalahan dan memberi pesan yang sesuai; jangan menangkap semua kesalahan lalu menampilkan angka0 seolah benar.
Contoh kecil mempunyai batas
Program hanya memeriksa satu pasangan nilai rekaan, tanpa transaksi bersamaan atau penyimpanan. Pemeriksaan tipe memakai type(x) is int agar nilai logika True/False tidak diperlakukan sebagai jumlah alat. Bentuk ini dipilih untuk kontrak latihan yang sempit, bukan satu-satunya gaya penulisan fungsi Python.
Fungsi persediaan pada data rekaan
def tersedia(total, dipinjam):
if type(total) is not int or type(dipinjam) is not int:
raise ValueError("jumlah harus bulat")
if total < 0 or dipinjam < 0 or dipinjam > total:
raise ValueError("jumlah di luar aturan")
return total - dipinjam
print(tersedia(12, 5))
print(tersedia(0, 0))
try:
print(tersedia(4, 6))
except ValueError:
print("Data tidak valid")Keluaran contoh
7 0 Data tidak valid
Exception ditangani pada pemanggil. Pemeriksaan tipe dan rentang merupakan kontrak contoh; kebenaran catatan nyata tetap memerlukan sumber.
Telusuri contoh
Apa beda return7 dan print(7)?
- return mengirim nilai untuk perhitungan berikutnya.
- print menulis tampilan; nilai kembalinya sendiri None.
- Pilih fungsi sesuai kebutuhan pemanggil.
Mengapa masukan invalid tidak diubah menjadi0?
- Nol merupakan hasil yang mungkin sah.
- Memakainya sebagai pengganti semua kesalahan menyamarkan masalah.
- Beri status atau kesalahan yang jelas sesuai kontrak.
print dan return tidak sama; menangkap kesalahan lalu mengembalikan0 dapat menyembunyikan data invalid.
Latihan mandiri
1 Apa hasil tersedia(12,5)?
Petunjuk awal
Pisahkan informasi yang diketahui, alasan yang diperlukan, dan batas kesimpulan. Periksa kembali contoh sebelum membuka pembahasan.
Pembahasan · buka setelah mencoba
7.
2 Apa hasil tersedia(0,0)?
Petunjuk awal
Pisahkan informasi yang diketahui, alasan yang diperlukan, dan batas kesimpulan. Periksa kembali contoh sebelum membuka pembahasan.
Pembahasan · buka setelah mencoba
0, valid.
3 Mengapa tersedia(4,6) ditolak?
Petunjuk awal
Pisahkan informasi yang diketahui, alasan yang diperlukan, dan batas kesimpulan. Periksa kembali contoh sebelum membuka pembahasan.
Pembahasan · buka setelah mencoba
Dipinjam melebihi total.
4 Mengapa fungsi tidak langsung menyimpan berkas?
Petunjuk awal
Pisahkan informasi yang diketahui, alasan yang diperlukan, dan batas kesimpulan. Periksa kembali contoh sebelum membuka pembahasan.
Pembahasan · buka setelah mencoba
Tanggung jawab hitungan dipisah agar dapat diuji dan digunakan tanpa efek samping yang tidak diperlukan.
Perluas pemahamanmu
Tambahkan pesan antarmuka yang menyebut kolom bermasalah tanpa membocorkan data lain. Pertahankan fungsi hitungan terpisah dari tampilan.
Coba dengan umpan balik
Latihan otomatis membantu pemeriksaan; tuliskan alasan dan langkah untuk membuktikan pemahaman.
1 Masukan total4 dipinjam6 harus…
Petunjuk awal
Tentukan informasi, konsep dan bukti yang dibutuhkan.
Pembahasan · buka setelah mencoba
B. ditolak sesuai kontrak. Kontrak model melarang jumlah dipinjam melebihi total.
Praktik dan refleksi
Tulis tabel panggilan, hasil yang diharapkan, hasil aktual, dan status. Jelaskan setiap kasus sebelum menjalankan kode.
Penanda pribadi di perangkat ini; bukan nilai atau bukti penguasaan.