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:
checkcodedan 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:
| Aturan | Contoh kurang tepat | Contoh konsisten |
|---|---|---|
| Fungsi = kata kerja (apa yang dilakukan) | data2.m, proses.m | hitungPajak.m, bacaSkor.m |
| Variabel = kata benda (apa isinya) | x, tmp, arr2 | hargaSatuan, daftarSkor |
| Konstanta = HURUF BESAR | ambang = 2; | AMBANG_TAHUN = 2; |
| Boolean = kalimat tanya | flag = 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):
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
endMari kita bedah perbedaan kedua versi:
- Fungsi utama
gajiVersiBaru: tiga baris yang terbaca seperti rumus bisnis —bonus,tunjangan,pajak— bukan delapan baris berisi angka. Pembaca menangkap alur dalam sepuluh detik. AMBANG_TAHUN = 2: angka2kini punya nama dan komentar “di atas ambang ini bonus penuh”. Ketika kebijakan berubah, satu baris konstanta di satu helper diubah — bukan berburu2tersebar di seluruh berkas.- Helper murni:
hitungBonusmenerimapokokdantahun, mengembalikan angka, tanpa menyentuh state luar — mudah diuji terpisah (dan tidak menimbulkan efek samping di base workspace). - Validasi
isequal: refactor sah hanya jika hasil tidak berubah —contoh.mmemanggil kedua versi dengan input sama laluassert(isequal(...)).
Output yang Dihasilkan (dari contoh.m lengkap):
== 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 functionAnti-Pola yang Harus Dihindari #
| Anti-pola | Bahaya | Pengganti yang aman |
|---|---|---|
global SHARE | state tersembunyi; urutan pemanggilan mengubah hasil | argumen masuk, nilai balik keluar |
eval(str) | string dieksekusi sebagai kode MATLAB saat runtime | fungsi biasa, str2double, function handle |
clear all di kode produksi | membuang fungsi ter-precompile → program melambat setiap kali | clear namaVariabel yang spesifik |
size = 3 (menimpa bawaan) | shadowing fungsi size() di seluruh workspace | nama 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.