Kode yang benar tetapi berantakan tetap mahal: kode dibaca jauh lebih sering daripada ditulis — oleh rekan reviewer, oleh diri sendiri enam bulan kemudian, bahkan oleh linter otomatis yang menilai pola berisiko. Coding style adalah kumpulan keputusan kecil (penamaan, panjang fungsi, komentar, konstanta) yang membuat keputusan-keputusan itu tidak perlu diperdebatkan ulang setiap baris. Chapter ini membahas:

  • Alat penegak style: checkcode dan batas kompleksitas fungsi.
  • Konvensi penamaan, refactor konstanta ajaib, dan anti-pola berbahaya.

Alat Penegak: checkcode dan Batas Kompleksitas #

Sisi penegakan otomatis sudah kita bahas tuntas di chapter Code Analysis: checkcode memindai berkas .m dan menandai variabel tak terpakai (NASGU), shadowing fungsi bawaan, array yang tumbuh dalam loop (AGROW), plus lintasan real-time di Editor MATLAB. Sisi manual yang belum dibahas adalah ukuran: berapa panjang fungsi masih sehat?

Dua patokan praktis menjawabnya. Pertama, panjang: fungsi di atas ±50 baris efektif biasanya mengerjakan lebih dari satu hal — pecah menjadi beberapa fungsi helper. Kedua, kompleksitas siklomatik (McCabe): jumlah jalur independen melalui kode, yang tumbuh setiap if/while/case/&&. Fungsi dengan kompleksitas tinggi butuh kombinasi uji yang meledak; checkcode(..., '-cyc') melaporkannya di MATLAB. Keduanya bukan angka sakral, melainkan alarm dini — melewati batas berarti “baca ulang desainnya”, bukan “potong otomatis”.

Konvensi Penamaan #

Nama adalah dokumentasi termurah. Konvensi yang bekerja baik untuk MATLAB:

AturanContoh kurang tepatContoh konsisten
Fungsi = kata kerja (apa yang dilakukan)data2.m, proses.mhitungPajak.m, bacaSkor.m
Variabel = kata benda (apa isinya)x, tmp, arr2hargaSatuan, daftarSkor
Konstanta = HURUF BESARambang = 2;AMBANG_TAHUN = 2;
Boolean = kalimat tanyaflag = 1;isValid = true;
Konversi = prefiks ke*/to*ubah(x)keCelsius(x)

Prefiks/sufiks umum yang mempercepat pembacaan: isValid*/ada* untuk hasil uji, hitung* untuk perhitungan murni, uji* untuk skrip uji, n atau jumlah* untuk hitungan (nSiswa). Komentar hanya menjelaskan mengapa — “di atas ambang ini bonus penuh” — karena kode sudah menjawab apa dan bagaimana.

Refactor: Konstanta Bernama dan Fungsi Pendek #

Contoh klasiknya fungsi gaji dengan konstanta ajaib. Versi sebelum dan sesudah (keduanya dari contoh.m):

matlab
function total = gajiVersiLama(pokok, tahun)
%SEBELUM: konstanta ajaib menyatu dengan logika.
    if tahun > 2
        bonus = pokok * 0.15;
    else
        bonus = pokok * 0.05;
    end
    tunjangan = 500000 + tahun * 250000;
    pajak = (pokok + bonus) * 0.1;
    total = pokok + bonus + tunjangan - pajak;
end

function total = gajiVersiBaru(pokok, tahun)
%SESUDAH: fungsi utama hanya merangkai alur; detail ada di helper.
    bonus = hitungBonus(pokok, tahun);
    tunjangan = hitungTunjangan(tahun);
    total = pokok + bonus + tunjangan - hitungPajak(pokok + bonus);
end

function b = hitungBonus(pokok, tahun)
% Helper murni: bonus tahunan sesuai masa kerja.
    AMBANG_TAHUN = 2;      % di atas ambang ini bonus penuh
    BONUS_LAMA = 0.15;
    BONUS_BARU = 0.05;
    if tahun > AMBANG_TAHUN
        b = pokok * BONUS_LAMA;
    else
        b = pokok * BONUS_BARU;
    end
end

Mari kita bedah perbedaan kedua versi:

  1. Fungsi utama gajiVersiBaru: tiga baris yang terbaca seperti rumus bisnis — bonus, tunjangan, pajak — bukan delapan baris berisi angka. Pembaca menangkap alur dalam sepuluh detik.
  2. AMBANG_TAHUN = 2: angka 2 kini punya nama dan komentar “di atas ambang ini bonus penuh”. Ketika kebijakan berubah, satu baris konstanta di satu helper diubah — bukan berburu 2 tersebar di seluruh berkas.
  3. Helper murni: hitungBonus menerima pokok dan tahun, mengembalikan angka, tanpa menyentuh state luar — mudah diuji terpisah (dan tidak menimbulkan efek samping di base workspace).
  4. Validasi isequal: refactor sah hanya jika hasil tidak berubah — contoh.m memanggil kedua versi dengan input sama lalu assert(isequal(...)).

Output yang Dihasilkan (dari contoh.m lengkap):

text
== Bagian 1: probe linter ==
exist('checkcode') = 0 (linter MATLAB; 0 di engine uji)
== Bagian 2: refactor gaji ==
gaji versi lama = Rp6425000
gaji versi baru = Rp6425000
hasil identik setelah refactor: 1
struktur sebelum : 1 fungsi, 6 konstanta ajaib
struktur sesudah : 1 fungsi utama + 3 helper murni
konstanta sesudah: AMBANG_TAHUN, BONUS_LAMA, BONUS_BARU,
                    TUNJANGAN_DASAR, TUNJANGAN_PER_TAHUN, TARIF_PAJAK
== Bagian 3: pembersihan ==
tidak ada berkas uji: seluruh versi fungsi adalah local function

Anti-Pola yang Harus Dihindari #

Anti-polaBahayaPengganti yang aman
global SHAREstate tersembunyi; urutan pemanggilan mengubah hasilargumen masuk, nilai balik keluar
eval(str)string dieksekusi sebagai kode MATLAB saat runtimefungsi biasa, str2double, function handle
clear all di kode produksimembuang fungsi ter-precompile → program melambat setiap kaliclear namaVariabel yang spesifik
size = 3 (menimpa bawaan)shadowing fungsi size() di seluruh workspacenama variabel lain

Gaya Lama vs Modern #

Kurung tunggal 'teks' (char) dan kutip ganda "teks" (string, R2016b+) sama-sama valid; pilihnya berdasarkan konteks. Char cocok untuk label format, nama berkas, dan argumen fungsi lama; string cocok untuk teks data yang dibandingkan, digabung, dan dipecah dengan contains/replace. Yang penting: konsisten dalam satu modul. Di wilayah lain, blok arguments (R2019b+) menjadi cara modern memvalidasi input fungsi — dibahas di chapter Error Handling dan tergolong MATLAB-only.

Ringkasan #

Coding style MATLAB menegakkan tiga hal: nama yang menjelaskan dirinya (fungsi kata kerja, variabel kata benda, konstanta HURUF BESAR), fungsi pendek di bawah ±50 baris dengan kompleksitas terkendali, dan refactor yang divalidasi isequal — dibuktikan contoh.m pada fungsi gaji: hasil identik, struktur berubah dari 1 fungsi 6 konstanta ajaib menjadi 3 helper murni ber-konstanta bernama. checkcode menegakkan aturan secara otomatis di MATLAB; anti-pola global, eval, dan clear all dihindari dengan padanan yang eksplisit dan bisa diperiksa.