Fungsi yang baik bukan hanya menghitung dengan benar — fungsi yang baik menolak input yang salah dengan pesan yang jelas. Tanpa validasi, kesalahan pemanggil menjerumus ke galat yang membingungkan: input kurang satu muncul sebagai Unrecognized function or variable 'lebar', jari-jari negatif menghasilkan volume negatif yang tampak sah, satuan yang salah mengalir diam-diam ke laporan. Validasi adalah kontrak tertulis antara fungsi dan pemanggilnya. MATLAB menyediakan dua cara menuliskannya: pemeriksaan manual nargin + error() yang berlaku di semua lingkungan, dan arguments block deklaratif sejak R2019b. Cakupan chapter ini:
- pola validasi manual: jumlah argumen, tipe, ukuran, nilai, keanggotaan
- anatomi lengkap
argumentsblock — dimensi, kelas, validator, default, name-value - pesan galat otomatis yang dihasilkan MATLAB
Validasi Manual: nargin + error #
Aturannya: setiap asumsi tentang input diperiksa sebelum dipakai, dan setiap pelanggaran dihentikan dengan error() berisi identifier dan pesan (pola dari Chapter Error Handling Dasar). Mekanisme di balik layar: pemeriksaan dijalankan sebagai if biasa di awal badan fungsi; satu kondisi gagal berarti MATLAB menghentikan fungsi saat itu juga — kode perhitungan di bawahnya tidak pernah tersentuh input yang buruk. Berkas volumeTabung.m memvalidasi jumlah argumen, tipe, nilai positif, dan keanggotaan satuan:
function volume = volumeTabung(r, t, satuan)
% volumeTabung Volume tabung dengan validasi input manual.
% volume = volumeTabung(r, t) menghitung volume tabung dengan jari-jari
% r dan tinggi t (dalam meter), hasil dalam meter kubik ('m3').
% volume = volumeTabung(r, t, satuan) memilih satuan hasil:
% 'm3' (default) atau 'liter'.
% --- validasi manual: jumlah argumen ---
if nargin < 2
error('volumeTabung:argumenKurang', ...
'Butuh minimal 2 input: r dan t.');
end
% --- validasi manual: tipe dan nilai ---
if ~isscalar(r) || ~isnumeric(r) || r <= 0
error('volumeTabung:rTidakValid', ...
'r harus skalar numerik positif.');
end
if ~isscalar(t) || ~isnumeric(t) || t <= 0
error('volumeTabung:tTidakValid', ...
't harus skalar numerik positif.');
end
% --- argumen opsional dengan nilai default ---
if nargin < 3
satuan = 'm3';
end
if ~any(strcmp(satuan, {'m3', 'liter'}))
error('volumeTabung:satuanTidakValid', ...
'satuan harus ''m3'' atau ''liter''.');
end
volume = pi * r^2 * t;
if strcmp(satuan, 'liter')
volume = volume * 1000; % 1 m3 = 1000 liter
end
endMari kita bedah baris-baris kode di atas:
- Baris 11-14 (
if nargin < 2 ... error(...)): pemeriksaan paling awal — jumlah argumen; tanpa ini, input yang kurang meledak jadi galat variabel tak dikenal di baris perhitungan. - Baris 17-24 (
if ~isscalar(r) || ~isnumeric(r) || r <= 0): tiga syarat digabung dengan||(evaluasi berhenti di kegagalan pertama) — skalar, numerik, positif; pola yang sama untukt. - Baris 30-33 (
~any(strcmp(satuan, ...))): keanggotaan daftar —strcmpmembandingkansatuandengan tiap anggota cell array,anymengumpulkan hasilnya. - Baris 35-39 (
volume = pi * r^2 * t; ...): perhitungan inti baru berjalan setelah seluruh kontrak lolos.
Skrip uji uji_volumeTabung.m memanggil dua kasus sah dan tiga kasus yang harus ditolak:
% panggilan valid
v1 = volumeTabung(1, 2);
fprintf('volumeTabung(1, 2) : %.6f m3\n', v1);
v2 = volumeTabung(0.5, 1, 'liter');
fprintf('volumeTabung(0.5, 1, liter) : %.6f liter\n', v2);
% input tidak valid ditolak dengan pesan galat yang jelas
try
volumeTabung(-1, 2);
catch err
fprintf('ditolak (-1, 2) : %s\n', err.message);
end
try
volumeTabung(1);
catch err
fprintf('ditolak (1) : %s\n', err.message);
end
try
volumeTabung(1, 2, 'galon');
catch err
fprintf('ditolak (galon) : %s\n', err.message);
endOutput yang Dihasilkan:
volumeTabung(1, 2) : 6.283185 m3
volumeTabung(0.5, 1, liter) : 785.398163 liter
ditolak (-1, 2) : r harus skalar numerik positif.
ditolak (1) : Butuh minimal 2 input: r dan t.
ditolak (galon) : satuan harus 'm3' atau 'liter'.Pesan-pesan itu berasal dari fungsi kita sendiri — pemanggil tahu persis apa yang salah dan cara memperbaikinya.
arguments Block: Kontrak yang Dideklarasikan #
arguments block (MATLAB R2019b+) memindahkan seluruh kontrak di atas ke deklarasi — satu baris per argumen memuat dimensi, kelas, validator, dan default. Versi volumeTabung yang sama, kini dengan name-value untuk satuan:
function volume = volumeTabung(r, t, opsi)
% volumeTabung Volume tabung dengan arguments block (MATLAB R2019b+).
arguments
r (1,1) double {mustBePositive}
t (1,1) double {mustBePositive}
opsi.Satuan (1,1) char {mustBeMember(opsi.Satuan, {'m3', 'liter'})} = 'm3'
end
volume = pi * r^2 * t;
if strcmp(opsi.Satuan, 'liter')
volume = volume * 1000; % 1 m3 = 1000 liter
end
endAnatomi satu baris deklarasi, contoh r:
| Bagian | Contoh | Peran |
|---|---|---|
| nama argumen | r | harus cocok dengan parameter di baris function |
| dimensi | (1,1) | ukuran yang diharapkan; : berarti bebas |
| kelas | double | tipe yang diharapkan (atau yang bisa dikonversi) |
| validators | {mustBePositive} | fungsi pemeriksa dalam kurung kurawal, dipisah koma |
| nilai default | = 'm3' | kehadirannya menjadikan argumen opsional |
Tiga hal terjadi otomatis: volumeTabung(1) ditolak tanpa satu baris nargin (argumen wajib t tidak dikirim), r = -1 ditolak oleh mustBePositive, dan Satuan yang di luar daftar ditolak oleh mustBeMember. Pemanggilan yang sah:
volumeTabung(1, 2) % Satuan default 'm3'
volumeTabung(0.5, 1, 'Satuan', 'liter') % name-value (R2019b+)
volumeTabung(0.5, 1, Satuan='liter') % sintaks = (R2021a+)Validator yang sering kita butuhkan (daftar resmi berisi puluhan fungsi mustBe*):
| Validator | Menolak saat nilai |
|---|---|
mustBePositive | <= 0 |
mustBeNonnegative | < 0 |
mustBeNumeric | bukan array numerik |
mustBeInteger | bukan bilangan bulat |
mustBeScalar | bukan skalar 1×1 |
mustBeMember(v, S) | tidak ada di daftar S |
mustBeGreaterThan(v, c) | <= c |
Pesan Galat Otomatis #
Saat validasi arguments gagal, MATLAB merangkai pesannya sendiri — menyebut posisi argumen dan aturan yang dilanggar. Formatnya mengikuti pola dari dokumentasi resmi:
Error using volumeTabung
Invalid argument at position 1. Value must be positive.Pesan ini konsisten untuk seluruh fungsi yang memakai arguments — pemanggil tidak perlu membaca isi fungsi untuk tahu kontraknya. Dibanding pola manual, ada satu trade-off: identifier galat khas milik kita (volumeTabung:rTidakValid) hilang, diganti mekanisme standar MATLAB; untuk menangkapnya dalam try/catch, cukup periksa err.message.
Validasi Manual vs arguments Block #
| Pemeriksaan | Manual (if + error) | arguments block |
|---|---|---|
| Jumlah argumen | if nargin < k | otomatis + default |
| Tipe & ukuran | isnumeric, isscalar | (1,1) double |
| Rentang nilai | r <= 0 | {mustBePositive} |
| Keanggotaan daftar | strcmp + any | {mustBeMember(v, S)} |
| Name-value | loop varargin (Chapter sebelumnya) | opsi.Nama |
| Berjalan di | MATLAB & Octave semua versi | MATLAB R2019b+ saja |
Aturan praktis kita: proyek lintas lingkungan atau API publik yang butuh identifier galat khas → pola manual; kode internal MATLAB modern → arguments block yang ringkas dan seragam.
Ringkasan #
Validasi input menutup pintu bagi kesalahan pemanggil sebelum perhitungan berjalan. Pola manual memeriksa jumlah argumen (nargin), tipe dan ukuran (isscalar, isnumeric), nilai (<= 0), dan keanggotaan (strcmp), lalu menghentikan program lewat error() dengan identifier dan pesan kita sendiri — pola ini teruji di MATLAB maupun Octave. arguments block (R2019b+, MATLAB-ONLY) mendeklarasikan dimensi, kelas, validator mustBe*, default, dan name-value dalam satu blok, dengan pesan galat otomatis berformat Invalid argument at position .... Keduanya menegaskan kontrak fungsi yang sama — pilih berdasarkan lingkungan target dan kebutuhan pesan galat. Berkas volumeTabung.m dan uji_volumeTabung.m di bagian bawah halaman memuat versi manual yang sudah teruji penuh.