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 arguments block — 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:

matlab
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
end

Mari kita bedah baris-baris kode di atas:

  1. 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.
  2. 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 untuk t.
  3. Baris 30-33 (~any(strcmp(satuan, ...))): keanggotaan daftar — strcmp membandingkan satuan dengan tiap anggota cell array, any mengumpulkan hasilnya.
  4. 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:

matlab
% 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);
end

Output yang Dihasilkan:

text
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:

matlab
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
end

Anatomi satu baris deklarasi, contoh r:

BagianContohPeran
nama argumenrharus cocok dengan parameter di baris function
dimensi(1,1)ukuran yang diharapkan; : berarti bebas
kelasdoubletipe 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:

matlab
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*):

ValidatorMenolak saat nilai
mustBePositive<= 0
mustBeNonnegative< 0
mustBeNumericbukan array numerik
mustBeIntegerbukan bilangan bulat
mustBeScalarbukan 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:

text
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 #

PemeriksaanManual (if + error)arguments block
Jumlah argumenif nargin < kotomatis + default
Tipe & ukuranisnumeric, isscalar(1,1) double
Rentang nilair <= 0{mustBePositive}
Keanggotaan daftarstrcmp + any{mustBeMember(v, S)}
Name-valueloop varargin (Chapter sebelumnya)opsi.Nama
Berjalan diMATLAB & Octave semua versiMATLAB 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.