Penamaan adalah skill paling penting dalam clean code. Nama yang baik membuat kode self-documenting — tidak perlu komentar untuk menjelaskan.
Prinsip 1: Nama harus menjelaskan tujuan (intent)
// BURUK
const d = new Date();
const arr = users.filter(u => u.a);
let flag = false;
// BERSIH
const currentDate = new Date();
const activeUsers = users.filter(user => user.isActive);
let isFormSubmitted = false;
Prinsip 2: Hindari singkatan misterius
// BURUK
function calcTtlPrc(itms) {
return itms.reduce((t, i) => t + i.p * i.q, 0);
}
// BERSIH
function calculateTotalPrice(items) {
return items.reduce((total, item) => total + item.price * item.quantity, 0);
}
Prinsip 3: Boolean harus berbentuk pertanyaan
// BURUK
let open = true;
let user = false;
let data = true;
// BERSIH
let isModalOpen = true;
let hasUser = false;
let isDataLoaded = true;
// Prefix yang umum: is, has, can, should, will
Prinsip 4: Fungsi = verb, Variable = noun
// BURUK
function userData() { ... } // noun — apa yang dilakukan?
function process() { ... } // terlalu vague
const calculate = 100; // verb untuk variable
// BERSIH
function fetchUserData() { ... } // jelas: mengambil data user
function validateEmail() { ... } // jelas: validasi email
const totalPrice = 100; // noun untuk variable
Prinsip 5: Gunakan konvensi yang konsisten
// Pilih SATU style dan konsisten:
// get/fetch untuk mengambil data
function getUser() { ... }
function getUserOrders() { ... }
// is/has untuk boolean
function isValidEmail(email) { ... }
function hasPermission(user, action) { ... }
// handle untuk event handlers
function handleClick() { ... }
function handleFormSubmit() { ... }
// on untuk callback props
<Button onClick={handleClick} />
Prinsip 6: Panjang nama sesuai scope
// Loop pendek — nama pendek OK
for (let i = 0; i < 10; i++) { ... }
items.map(item => item.name);
// Scope lebar — nama harus deskriptif
const maximumLoginAttempts = 5;
const userAuthenticationToken = "...";
// BUKAN sebaliknya:
const m = 5; // apa ini? scope lebar tapi nama pendek
for (let userItemIndex = 0; userItemIndex < 3; userItemIndex++) { } // overkill untuk loop
Prinsip 7: Jangan encode tipe di nama
// BURUK (Hungarian notation)
const strName = "Budi";
const arrUsers = [1, 2, 3];
const objConfig = {};
// BERSIH
const name = "Budi";
const users = [1, 2, 3];
const config = {};
// IDE modern sudah menunjukkan tipe
Cheat sheet penamaan:
| Konteks | Buruk | Bersih |
|---|---|---|
| Array | list, data |
users, products, orderItems |
| Boolean | flag, status |
isVisible, hasAccess, canEdit |
| Fungsi ambil data | data(), users() |
fetchUsers(), getOrderById() |
| Event handler | click(), submit() |
handleClick(), handleSubmit() |
| Counter | c, n |
retryCount, pageNumber |
🎭 Analogi sehari-hari
Penamaan variable itu kayak labelin kotak penyimpanan di gudang. Kotak label "Stuff" / "Misc" — kamu BUKA tiap kotak satu-satu pas nyari sesuatu (waktu terbuang). Kotak label "Documents 2024 Pajak Kuartal 3" / "Spare parts AC unit 2 lantai bawah" — kamu langsung ambil yang benar tanpa buka. Investasi awal beberapa detik nulis label yang jelas = hemat berjam-jam pencarian nanti. Variabel d vs currentDate — bedanya 11 karakter, manfaatnya ribuan jam tim devkamu untuk 5 tahun ke depan.
⚠️ Jebakan yang sering ditemui
- Singkatan kreatif yang cuma kamu paham —
usrAccVrf,prodCtg2= bingung pas balik 6 bulan kemudian. Tulis penuh, IDE auto-complete kok. - Pakai
dataatauinfountuk semua — terlalu generic.userData,formData,apiResponselebih spesifik. - Hungarian notation (
strName,arrUsers) — outdated. IDE/TypeScript udah show types. - Verb di variabel, noun di fungsi — ketuker. Variabel = noun (
totalPrice), fungsi = verb (calculatePrice). - Nama 1-huruf di scope lebar —
for (let i...)di loop kecil OK.const m = 5di top level file = bingung. - Boolean tanpa prefix —
open,loaded,visibleambigu. PakaiisOpen,hasLoaded,isVisible. - Inkonsisten antar file —
getUserdi file A,fetchUserdi file B = confusing. Pilih satu, konsisten. - Menyimpan tipe data di nama —
productListboleh, tapiproductListArrayoverkill (List = sudah implied array).
🎯 Pilih prefix function —
getvsfetchvsloadvsfind?
get*— sync access, gak hit network (getName(),getElementById())fetch*— async + network (fetchUsers(),fetchOrderById())load*— async + first-time load with side effects (loadConfig(),loadDashboard())find*— search dengan kondisi, return null kalau gak ada (findUser(),findById())is*— boolean check (isValid(),isAuthenticated())has*— possession check (hasPermission(),hasErrors())handle*— event handler (handleClick(),handleSubmit())on*— callback prop (onClick,onChange)Aturan: pilih konvensi tim, dokumentasikan di style guide, follow konsisten.
TL;DR: Penamaan = skill paling penting clean code. Aturan: nama jelaskan TUJUAN (intent), hindari singkatan misterius, boolean prefix is/has/can, fungsi = verb, variable = noun, panjang nama match scope. Konvensi konsisten: get (sync), fetch (async network), is/has (boolean), handle (event). Jangan encode tipe di nama (Hungarian notation outdated). IDE auto-complete bikin nama panjang gak masalah ngetik.