Proyek MATLAB yang tumbuh tanpa rencana biasanya berakhir sebagai tumpukan berkas: analisis1.m, analisis_fix.m, data_baru.csv, dan gambar hasil tersebar di satu folder. Enam bulan kemudian, tidak ada yang ingat berkas mana yang harus dijalankan lebih dulu, dan skrip hanya berjalan bila current folder kebetulan benar. Chapter ini membahas struktur proyek standar yang mencegah masalah tersebut:

  • Struktur folder standar src/, data/, tests/, docs/, hasil/ beserta pemisahan tanggung jawabnya.
  • Penamaan berkas .m yang konsisten (nama fungsi = nama berkas).
  • Path setup deterministik dengan startProyek.m yang teruji.
  • README sebagai pintu masuk proyek dan kapan struktur ringan sudah cukup.

Struktur Standar Proyek #

Aturannya sederhana: pisahkan kode, data, uji, dokumentasi, dan hasil ke dalam folder berbeda. Diagram berikut memperlihatkan struktur minimal yang sudah cukup untuk proyek analisis menengah:

text
proyek-analisis/
    src/            fungsi dan skrip inti proyek
    data/           data mentah (input, tidak pernah diubah kode)
    tests/          skrip uji otomatis
    docs/           catatan desain, diagram, draf laporan
    hasil/          output: grafik, .mat, laporan jadi
    startProyek.m   setup path, dipanggil sekali per sesi
    README.md       panduan singkat cara menjalankan proyek

Mekanisme di balik layar: MATLAB mencari fungsi pada search path, bukan pada struktur folder proyek kita. Folder src/, data/, dan hasil/ tidak punya arti khusus bagi MATLAB — artinya murni konvensi kita sebagai pengembang. Tabel berikut merangkum pemisahan tanggung jawab tiap folder:

FolderIsiDi-commit ke git?Berubah saat eksekusi?
src/fungsi intiyatidak
data/data mentahya (kecil), filter (besar)tidak
tests/skrip ujiyatidak
docs/catatan, diagramyatidak
hasil/output programtidak (di-ignore)ya

Pemisahan ini membuat tiga hal mudah: mencadangkan kode tanpa hasil yang besar, menjalankan ulang analisis pada data yang sama, dan membersihkan hasil lama tanpa takut menghapus kode.

Kapan struktur ringan sudah cukup #

Struktur lima folder bukan kewajiban. Skrip eksplorasi dengan satu atau dua berkas cukup diletakkan di satu folder datar bersama README.md singkat. Naikkan ke struktur penuh ketika salah satu kondisi berikut terpenuhi: jumlah berkas .m melebihi lima, proyek memakai berkas data, hasil analisis perlu disimpan terpisah, atau proyek akan dibagikan ke orang lain.

Penamaan Berkas .m #

Aturan paling penting: satu fungsi per berkas, dan nama berkas harus sama dengan nama fungsi. Saat kita memanggil konversiSuhu(212), MATLAB memindai search path mencari berkas bernama konversiSuhu.m; nama fungsi di dalam berkas harus identik dengan nama berkasnya, jika tidak MATLAB menolak berkas tersebut. Konvensi tambahan yang menjaga konsistensi:

Jenis berkasPola namaContoh
Fungsikata kerja deskriptif, camelCasehitungPajak.m
Fungsi utilitasdomain + tindakanformatTanggal.m
Skrip pipelinekata kerja “jalankan”jalankanAnalisis.m
Skrip ujiprefiks ujiujiKonversi.m
Datahuruf kecil + underscorenilai_ujian.csv

Path Setup Deterministik #

Masalah nyata: skrip yang bergantung pada current folder berhenti bekerja begitu pengguna membuka MATLAB dari lokasi lain. Solusinya adalah berkas startProyek.m — satu fungsi kecil yang menyiapkan path secara deterministik:

matlab
function p = startProyek()
%STARTPROYEK Siapkan path proyek (deterministik).
%   P = STARTPROYEK() menambahkan folder src dan tests ke path
%   MATLAB lalu mengembalikan daftar lokasinya.
root = fileparts(mfilename('fullpath'));
p = {fullfile(root, 'src'), fullfile(root, 'tests')};
cellfun(@addpath, p);
fprintf('startProyek: folder src dan tests ditambahkan ke path\n')
end

Mari kita bedah baris-baris kode di atas:

  1. Baris 5 (root = fileparts(mfilename('fullpath'));): mfilename('fullpath') mengembalikan lokasi berkas startProyek.m yang sedang dieksekusi, lalu fileparts membuang nama berkasnya sehingga root berisi folder proyek — di mana pun pengguna meletakkan proyek.
  2. Baris 6 (p = {fullfile(...), fullfile(...)};): fullfile membangun path lintas sistem operasi (pemisah / atau \ diserahkan ke MATLAB), satu entri untuk src dan satu untuk tests.
  3. Baris 7 (cellfun(@addpath, p);): kedua folder ditambahkan ke search path sekaligus. Mulai titik ini, fungsi di src/ dapat dipanggil dari current folder mana pun.
  4. Baris 8 (fprintf(...)): konfirmasi ringkas sehingga pengguna tahu setup benar-benar berjalan.

contoh.m di bawah halaman ini membangun struktur lengkap, menulis berkas dummy (fungsi, CSV, uji, README), lalu menguji pola ini dengan cara paling keras: current folder sengaja dipindahkan ke folder kosong sebelum startProyek() dipanggil. Potongan ujinya:

matlab
    addpath(root);
    cwdAsal = pwd();
    folderLain = tempname();
    mkdir(folderLain);
    cd(folderLain);                             % current folder sengaja diubah
    p = startProyek();                          % tetap berfungsi: mfilename, bukan pwd
    lokasi = which('konversiSuhu');
    fprintf('which(''konversiSuhu'') menunjuk src/konversiSuhu.m: %d\n', ...
            ~isempty(strfind(lokasi, ['src' filesep 'konversiSuhu.m'])));

Output yang Dihasilkan (dari contoh.m lengkap):

text
== Bagian 1: membuat struktur ==
struktur lengkap (src/data/tests/docs/hasil): 1
berkas ditulis: konversiSuhu.m, nilai_ujian.csv (9 baris), ...
              ujiKonversi.m, startProyek.m, README.md
== Bagian 2: path setup deterministik ==
startProyek: folder src dan tests ditambahkan ke path
addpath menambahkan folder: src, tests
which('konversiSuhu') menunjuk src/konversiSuhu.m: 1
== Bagian 3: verifikasi fungsi dan uji ==
konversiSuhu(212) = 100
ujiKonversi: LULUS (3 asersi)
== Bagian 4: pembersihan ==
proyek demo dihapus: exist = 0
folder kerja sementara dihapus: exist = 0

Baris which('konversiSuhu') menunjuk ... = 1 membuktikan startProyek() bekerja dari current folder yang salah; fungsi tetap ditemukan karena pencarian terjadi pada path, bukan pada folder aktif.

README Proyek #

README adalah berkas pertama yang dibaca orang (termasuk diri kita sendiri enam bulan kemudian). Isi minimal yang berguna: satu kalimat tujuan proyek, prasyarat (versi MATLAB dan toolbox), cara menjalankan, dan cara menjalankan uji. contoh.m menulis README berikut sebagai bagian dari demonstrasi:

text
# Demo Proyek Analisis
Cara menjalankan:
1. Panggil startProyek untuk menyiapkan path.
2. Jalankan fungsi di src/, contoh: konversiSuhu(212).
3. Uji: ujiKonversi.

README tidak dijalankan MATLAB, tetapi README menentukan apakah proyek bisa dijalankan orang lain tanpa menebak-nebak. Chapter Version Control dengan Git nanti memanfaatkan README yang sama sebagai wajah depan repository.

Ringkasan #

Struktur proyek standar memisahkan tanggung jawab: src/ untuk kode, data/ untuk input mentah, tests/ untuk uji, docs/ untuk catatan, hasil/ untuk output, ditambah startProyek.m dan README.md sebagai pintu masuk. Penamaan berkas mengikuti aturan nama berkas = nama fungsi. Path setup deterministik memakai fileparts(mfilename('fullpath')) sehingga proyek berjalan dari current folder mana pun — teruji di contoh.m dengan pemindahan folder aktif, verifikasi which, dan pembersihan menyeluruh.