- Saat memelihara codebase yang tidak familier, banyak waktu dihabiskan untuk mencari string
- Bahkan dalam proyek yang ditulis sendiri, kita tetap perlu sering mencari banyak hal seperti nama fungsi, pesan error, dan nama kelas
- Jika pencarian tidak berjalan baik, ada risiko referensi di codebase tidak ditemukan lalu dianggap tidak perlu
- Dalam konteks ini, penulis merumuskan beberapa aturan yang bisa diterapkan untuk menjaga Greppability pada codebase
Jangan memecah identifier
- Memecah identifier atau menyusunnya secara dinamis bukan ide yang baik
- Misalkan ada dua tabel database bernama
shipping_addresses dan billing_addresses, membangun nama tabel secara dinamis berdasarkan jenis pesanan mungkin terlihat bagus
const getTableName = (addressType: 'shipping' | 'billing') => {
return `${addressType}_addresses`
}
- Ini memang tampak DRY, tetapi kurang baik untuk maintenance. Seseorang yang mencari nama tabel
shipping_addresses di codebase bisa saja melewatkan bagian ini
- Hardcode identifier adalah pendekatan yang lebih baik
- Kode yang direfaktor demi kemudahan pencarian:
const getTableName = (addressType: 'shipping' | 'billing') => {
if (addressType === 'shipping') {
return 'shipping_addresses'
}
if (addressType === 'billing') {
return 'billing_addresses'
}
throw new TypeError('addressType must be billing or shipping')
}
- Hal yang sama berlaku untuk nama kolom, field objek, dan nama method/fungsi (di JavaScript, nama method dapat dengan mudah disusun secara dinamis)
Gunakan nama yang sama di seluruh stack
- Jangan mengganti nama field di batas aplikasi hanya demi menyesuaikan konvensi penamaan
- Contoh yang paling umum adalah membawa identifier snake_case bergaya PostgreSQL ke JavaScript lalu mengubahnya menjadi camelCase, dan itu bukan ide yang baik
- Ini membuat pencarian jadi lebih sulit. Untuk menemukan semua item, kita harus mencari dua string, bukan satu
const getAddress = async (id: string) => {
const address = await getAddressById(id)
return {
streetName: address.street_name,
zipCode: address.zip_code,
}
}
- Mengembalikan objeknya secara langsung justru lebih baik
const getAddress = async (id: string) => {
return await getAddressById(id)
}
Flat lebih baik daripada nested
- Terinspirasi dari Zen of Python, saat menangani namespace, dalam banyak kasus lebih baik membuat struktur folder/objek tetap flat daripada nested
- Jika ada dua opsi untuk konfigurasi file terjemahan:
{
"auth": {
"login": {
"title": "Login",
"emailLabel": "Email",
"passwordLabel": "Password",
},
"register": {
"title": "Register",
"emailLabel": "Email",
"passwordLabel": "Password",
}
}
}
{
"auth.login.title": "Login",
"auth.login.emailLabel": "Email",
"auth.login.passwordLabel": "Password",
"auth.register.title": "Login",
"auth.register.emailLabel": "Email",
"auth.register.passwordLabel": "Password",
}
- Sebaiknya pilih opsi kedua. Kunci lebih mudah ditemukan, dan bisa direferensikan seperti
t('auth.login.title')
- Jika melihat struktur komponen React:
./components/AttributeFilterCombobox.tsx
./components/AttributeFilterDialog.tsx
./components/AttributeFilterRating.tsx
./components/AttributeFilterSelect.tsx
- Ini lebih disukai daripada struktur seperti berikut
./components/attribute/filter/Combobox.tsx
./components/attribute/filter/Dialog.tsx
./components/attribute/filter/Rating.tsx
./components/attribute/filter/Select.tsx
- Dari sudut pandang pencarian, kita bisa mencari nama komponen lengkap yang memuat namespace seperti
AttributeFilterCombobox, alih-alih nama umum seperti Dialog
Opini GN⁺
- Tulisan blog ini menjelaskan dengan baik pentingnya pencarian identifier saat memelihara codebase
- Menyusun identifier secara dinamis atau mengganti nama di batas aplikasi membuat maintenance kode menjadi lebih sulit. Identifier harus konsisten dan jelas
- Sebaliknya, hardcode identifier dan menjaga namespace tetap flat lebih baik dari sudut pandang pencarian
- Untuk meningkatkan keterbacaan dan kemudahan maintenance kode, prinsip-prinsip ini layak diterapkan di proyek
- Selain aturan yang diajukan penulis, masih ada berbagai cara lain untuk meningkatkan kualitas kode, seperti menulis Self-Documenting Code dan menggunakan komentar yang bermakna
5 komentar
Tolong ubah ke full path dari JSON, saya juga tinggalkan satu alat yang membuatnya lebih greppable!
https://id.news.hada.io/topic?id=3159
Bagus juga... greppability ya...
Sepertinya juga berguna untuk menuliskan informasi yang bermanfaat dalam satu baris sebisa mungkin.
Bagus.
Opini Hacker News
Mencari simbol seperti nama fungsi dan nama kelas itu kurang efektif dibanding memakai alat yang memahami sintaks kode
Akan berguna jika alat grep punya mode "super case-insensitive"
Mendukung greppability
Saat merancang Hamilton, tujuannya adalah membuat definisi fungsi dan penggunaan turunannya mudah untuk di-grep
'greppable' bukan kata/konsep yang dipakai secara mandiri
Pernah melihat contoh rumit yang memakai interpolasi string bersyarat
Banyak gaya penulisan kode dan alat menjaga konstanta string tetap dalam satu baris tanpa memandang panjang baris
Rust, Javascript, dan Lisp menaruh kata kunci di depan definisi fungsi sehingga mudah dicari
Setuju dengan greppability, tetapi tidak setuju mempertahankan nama yang sama lintas batas
Kemudahan pencarian kode itu bagus, tetapi contohnya sengaja meningkatkan kemungkinan kesalahan