Proyek yang membesar cepat menghasilkan puluhan fungsi utility bernama generik: rata, bersihkan, formatTanggal. Ketika dua kolega menggabungkan kode mereka, dua fungsi berbeda dengan nama sama saling menimpa (shadowing) dan MATLAB hanya memakai satu — tanpa memberi tahu yang mana. Package +namespace menyelesaikan masalah ini dengan cara memberi setiap kumpulan fungsi ruang nama sendiri. Chapter ini membahas:
- Struktur folder
+namadan pemanggilanpaket.fungsi(). - Aturan teknis penting:
addpathharus menunjuk folder induk dari+folder. - Konflik nama terselesaikan, sub-package, dan kapan package lebih baik daripada folder biasa.
Package +folder #
Aturannya: buat folder yang namanya diawali tanda plus, lalu letakkan berkas fungsi di dalamnya. Fungsi tersebut kini hanya bisa dipanggil dengan nama berprefix: statistik.rata(v). Struktur lengkapnya:
proyek-analisis/
+statistik/
rata.m
deviasi.m
+regresi/
slope.m
+stata/
rata.m
startProyek.mMekanisme di balik layar: tanda plus pada nama folder memberi sinyal kepada MATLAB bahwa folder tersebut adalah package. MATLAB lalu mendaftarkan isinya ke namespace statistik, bukan ke ruang nama global. Fungsi rata.m di dalamnya tidak pernah terlihat sebagai rata biasa — pemanggil wajib menulis statistik.rata. Nama package sebaiknya satu kata, huruf kecil, dan mendeskripsikan domain: +util, +statistik, +io.
Pemanggilan berlapis untuk sub-package: statistik.regresi.slope(x, y) menjalankan fungsi slope.m di dalam +statistik/+regresi/. Sub-package berguna ketika satu package besar mulai memuat puluhan berkas dan perlu dikelompokkan lagi.
addpath Folder Indu #
Detail teknis ini paling sering menjegal pemula: yang ditambahkan ke path adalah folder induk dari +folder, bukan folder +statistik itu sendiri. Berikut uji keduanya dari contoh.m:
addpath(fullfile(root, '+statistik')); % salah: +folder sendiri
terlihatSalah = isPaketTerlihat();
fprintf('addpath(''+statistik'') langsung, fungsi terlihat: %d\n', terlihatSalah);
rmpath(fullfile(root, '+statistik'));
addpath(root); % benar: folder induk
terlihatBenar = isPaketTerlihat();
fprintf('addpath(folder induk), fungsi terlihat: %d\n', terlihatBenar);Mari kita bedah baris-baris kode di atas:
- Baris 1 (
addpath(fullfile(root, '+statistik'));):+statistikdimasukkan ke path sebagai folder biasa. Isinya tetap tak terlihat karena namespacestatistikhanya didaftarkan ketika induknya dipindai. - Baris 5 (
addpath(root);): folder induk ditambahkan. Saat MATLAB memindairoot, folder anak berawalan plus dikenali sebagai package dan namespacestatistikmenjadi aktif. - Fungsi
isPaketTerlihat(): pembungkustry/catchyang mencoba memanggilstatistik.rata([1 2 10])— gagal berarti fungsi package tidak dapat dijangkau dari path saat itu.
Konflik Nama Terselesaikan #
Dua fungsi bernama rata hidup berdampingan di package berbeda: +statistik/rata.m menghitung rata-rata, +stata/rata.m menghitung median. Keduanya dipanggil tanpa tabrakan:
== Bagian 3: konflik nama ==
statistik.rata([1 2 10]) = 4.3333 (mean)
stata.rata([1 2 10]) = 2.0000 (median)
nama sama, hasil beda, tanpa shadowing: 1
statistik.regresi.slope(x, y) = 2.0300 (sub-package)Nama berpointer (statistik.rata versus stata.rata) membuat resolusi nama menjadi eksplisit — tidak ada lagi “fungsi mana yang menang” karena keduanya punya alamat berbeda. Listing what() ikut membantu inspeksi: field packages memuat +stata dan +statistik, dan which('statistik.rata') menunjuk persis ke berkasnya.
Package vs Folder Biasa #
Package bukan pengganti folder biasa — package menyelesaikan masalah penamaan, bukan masalah organisasi berkas. Panduan pemilihannya:
| Kondisi | Pilihan | Alasan |
|---|---|---|
| Fungsi < 20, dipakai satu proyek | folder biasa (src/) | panggilan langsung, tanpa prefix |
| Fungsi ≥ 20 atau bernama generik | +package | mencegah tabrakan nama |
| Dipakai lintas proyek (library sendiri) | +package | antarmuka stabil, aman digabung |
| Helper internal satu modul | fungsi lokal / private/ | tidak pernah tampil di path publik |
Soal fungsi publik: yang dimaksudkan dipakai orang lain diletakkan sebagai berkas .m di dalam +package (pemanggil menulis paket.fungsi()). Helper yang bukan API publik cukup menjadi local function di ujung berkas fungsi utama, atau berada di folder private/ yang isinya hanya bisa dipanggil fungsi satu tingkat di atasnya — dua mekanisme ini sudah dibahas di chapter fungsi.
contoh.m di bawah halaman ini membuat dua package dan satu sub-package di folder sementara, menguji aturan addpath induk (negatif lalu positif), memanggil fungsi senama di kedua package, memeriksa what() dan which(), lalu menghapus semuanya.
Output yang Dihasilkan (dari contoh.m lengkap):
== Bagian 1: membuat package ==
+statistik/rata.m, +stata/rata.m, +statistik/+regresi/slope.m ditulis
== Bagian 2: addpath folder induk ==
addpath('+statistik') langsung, fungsi terlihat: 0
addpath(folder induk), fungsi terlihat: 1
== Bagian 3: konflik nama ==
statistik.rata([1 2 10]) = 4.3333 (mean)
stata.rata([1 2 10]) = 2.0000 (median)
nama sama, hasil beda, tanpa shadowing: 1
statistik.regresi.slope(x, y) = 2.0300 (sub-package)
== Bagian 4: listing ==
package terdeteksi: +stata, +statistik
which('statistik.rata') menunjuk +statistik/rata.m: 1
== Bagian 5: pembersihan ==
package dihapus: exist = 0Ringkasan #
Package +namespace memberi kumpulan fungsi ruang nama sendiri: statistik.rata(v) bukan lagi rata(v). Konflik nama antar fungsi senama terpecahkan karena tiap fungsi punya alamat berpointer, sub-package menambah kedalaman organisasi, dan what() serta which() tetap bisa memeriksa isinya. Kunci teknisnya: addpath diarahkan ke folder induk dari +folder — teruji positif-negatif di contoh.m — dan package dipilih ketika skala atau risiko tabrakan nama sudah tinggi.