1. Memahami Konvensi Penamaan
Konvensi penamaan sangat penting dalam pengembangan perangkat lunak, karena mereka memberikan kerangka kerja untuk memberi nama variabel, fungsi, dan identifikasi lainnya dengan cara yang konsisten dan deskriptif. Di Go (sering disebut sebagai Golang), mengikuti konvensi penamaan yang telah ditetapkan tidak hanya membuat kode Anda lebih mudah dibaca dan dipelihara, tetapi juga memungkinkan orang lain (dan diri Anda di masa depan) untuk memahami dan berkolaborasi dalam basis kode Anda dengan lebih sedikit hambatan.
1.1. Mengapa Penamaan Penting
Dalam bahasa pemrograman manapun, cara Anda memberi nama pada identifikasi dapat sangat memengaruhi pemahaman dan pemeliharaan kode Anda. Di Go, yang menekankan pada kesederhanaan dan kejelasan, penamaan yang tepat sangatlah penting. Nama-nama yang dengan jelas menyampaikan tujuan dari sebuah variabel atau fungsi mengurangi kebutuhan akan komentar tambahan dan membuat kode menjadi dokumentasi diri. Hal ini penting untuk memelihara basis kode dari waktu ke waktu dan untuk memungkinkan kolaborasi tim yang lancar.
1.2. Aturan Umum Penamaan
Aturan penamaan di Go sederhana namun sangat kuat:
-
Gunakan nama yang singkat dan padat: Go mendorong penggunaan nama yang singkat, terutama untuk variabel dengan cakupan kecil. Misalnya,
i
mungkin digunakan sebagai penghitung perulangan, tetapiindex
ataucounter
bisa digunakan jika diperlukan kejelasan yang lebih. -
Gunakan CamelCase untuk nama-nama dari beberapa kata: Ketika sebuah nama terdiri dari beberapa kata, gunakan notasi CamelCase. Nama-nama yang diekspor (yang seharusnya dapat diakses di luar paket) harus dimulai dengan huruf kapital (
MyFunction
), sedangkan nama-nama internal harus dimulai dengan huruf kecil (myFunction
). -
Gunakan nama yang bermakna: Nama harus cukup deskriptif untuk menyampaikan tujuan atau penggunaannya tanpa menjadi terlalu bertele-tele. Misalnya,
CalculateNetIncome
lebih disukai daripadaCNI
. -
Hindari penggunaan garis bawah: Berbeda dengan beberapa bahasa, konvensi Go menghindari penggunaan garis bawah dalam nama. Alih-alih
record_count
, Anda akan menggunakanrecordCount
. -
Singkatan harus konsisten: Ketika menggunakan singkatan dalam nama, pertahankan penulisan hurufnya secara konsisten. Untuk nama-nama yang diekspor, gunakan huruf besar semua (
HTTPServer
), dan untuk nama-nama internal, huruf kecil semua (httpServer
) adalah praktik standar. -
Nama paket harus sederhana: Nama paket di Go dijaga agar sederhana dan huruf kecil, tanpa garis bawah atau huruf besar campuran. Mereka harus merupakan satu kata yang dengan jelas mewakili tujuan dari paket (
net
,os
,json
). -
Penamaan variabel berdasarkan tipe: Untuk variabel yang mewakili instansi dari struktur data, umumnya digunakan nama strukturnya dalam huruf kecil sebagai nama variabel (
var user User
).
Berikut ini adalah contoh kode Go dengan komentar yang menjelaskan pilihan penamaan:
package main
import "fmt"
type User struct {
FirstName string
LastName string
Age int
}
func main() {
var currentUser User // Menggunakan nama struktur dalam huruf kecil sebagai nama variabel.
currentUser.FirstName = "John"
currentUser.LastName = "Doe"
currentUser.Age = 30
fmt.Println(formatUserDetails(currentUser))
}
// formatUserDetails mengambil struct User sebagai input dan mengembalikan string yang diformat.
// Nama fungsi dimulai dengan huruf kecil karena tidak diekspor (private).
func formatUserDetails(u User) string {
return fmt.Sprintf("Nama: %s %s, Umur: %d", u.FirstName, u.LastName, u.Age)
}
Mematuhi konvensi penamaan ini akan sangat meningkatkan kualitas kode Go Anda dengan membuatnya lebih mudah dibaca dan dipelihara.
2. Identifikasi di Go
Saat Anda memulai perjalanan dengan Go, sangat penting untuk memahami peran dari identifikasi. Identifikasi adalah nama-nama yang Anda berikan pada berbagai elemen dalam kode Anda, seperti variabel, fungsi, dan konstanta. Memilih nama-nama yang bermakna dan konsisten membantu membuat kode Anda lebih mudah dibaca dan dipelihara.
2.1. Konvensi Penamaan Variabel
Di Go, nama variabel harus dimulai dengan huruf atau garis bawah, diikuti oleh kombinasi huruf, digit, atau garis bawah. Namun, tidak disarankan untuk memulai dengan garis bawah karena sering kali disimpan untuk penggunaan khusus.
Best Practices:
- Gunakan nama-nama yang singkat dan deskriptif.
- Mulai dengan huruf kecil untuk cakupan tingkat paket.
- Gunakan format camelCase untuk nama-nama dengan beberapa kata (misalnya,
totalAmount
). - Untuk variabel yang diekspor (dapat diakses di luar paket), mulailah dengan huruf kapital.
Contoh:
var userName string // variabel tidak diekspor
var UserAge int // variabel diekspor
Komentar dalam kode menjelaskan perbedaan antara variabel yang diekspor dan yang tidak diekspor.
2.2. Konvensi Penamaan Fungsi
Fungsi dalam Go dinamai mengikuti aturan yang mirip dengan variabel. Nama harus mencerminkan tujuan fungsi, dan cakupannya menentukan huruf pertama dalam kata tersebut.
Praktik Terbaik:
- Gunakan nama yang deskriptif yang mencerminkan tujuan fungsi.
- Mulai dengan huruf kecil untuk fungsi internal.
- Gunakan PascalCase (dimulai dengan huruf kapital) untuk fungsi yang diekspor.
- Simpan nama fungsi singkat namun bermakna.
Contoh:
func calculateTotal(harga int, jumlah int) int { // fungsi internal
return harga * jumlah
}
func HitungDiskon(totalHarga int) float64 { // fungsi yang diekspor
return totalHarga * 0.1
}
Komentar menjelaskan aksesibilitas fungsi berdasarkan huruf besar dan memberikan wawasan singkat tentang tujuannya.
2.3. Konvensi Penamaan Konstanta
Konstanta adalah nilai yang tidak dapat diubah setelah didefinisikan. Dalam Go, konstanta dideklarasikan menggunakan kata kunci const
dan dapat berupa karakter, string, boolean, atau nilai numerik.
Praktik Terbaik:
- Gunakan huruf besar dengan garis bawah untuk pemisahan (misalnya,
MAX_LIMIT
). - Untuk konstanta berurutan, gunakan enumerator
iota
. - Konstanta yang diekspor harus dimulai dengan huruf besar.
Contoh:
const MAX_JUMLAH_ULANG int = 3 // konstanta yang diekspor
type UkuranByte float64
const (
_ = iota // abaikan nilai pertama dengan memberikan ke identitas kosong
KB UkuranByte = 1 << (10 * iota)
MB
GB
TB
)
Contoh tersebut menjelaskan cara mendefinisikan konstanta sederhana dan sekelompok konstanta terkait menggunakan iota
untuk ukuran byte.
3. Konvensi Penamaan untuk Tipe
Bagian ini fokus pada standar penamaan berbagai tipe seperti struct dan interface.
3.1. Pedoman Penamaan Structs
Ikhtisar: Struct dalam Go mewakili tipe data gabungan yang mengelompokkan variabel bersama. Saat menamai struct, gunakan nama deskriptif dalam PascalCase, yang dimulai dengan huruf kapital.
- Praktik Baik: Namai struct dengan kata benda atau frasa benda yang dengan jelas menjelaskan apa yang mereka wakili. Contohnya:
// Baik
type Pegawai struct {
ID int
NamaDepan string
NamaBelakang string
Posisi string
}
- Hindari: Menggunakan nama ambigu atau umum yang tidak menyampaikan tujuan struct.
// Hindari
type Data struct {
ID int
NamaDepan string
NamaBelakang string
Posisi string
}
3.2. Pedoman Penamaan Interface
Ikhtisar: Interface dalam Go menetapkan set metode dan dinamai menggunakan nama deskriptif yang diakhiri dengan sufiks 'er' jika masuk akal.
- Praktik Baik: Namai interface berdasarkan perilaku yang mereka abstraksikan. Biasanya, jika sebuah interface hanya berisi satu metode, nama harus mencerminkan tindakan metode tersebut ditambah sufiks '-er'.
// Baik
type Pembaca interface {
Baca(p []byte) (n int, err error)
}
- Pemberian Nama untuk Koleksi Perilaku: Jika sebuah interface mewakili kumpulan perilaku, pilih nama yang mencerminkan tujuannya tanpa sufiks 'er'.
// Contoh koleksi perilaku
type SistemBerkas interface {
BacaBerkas(path string) ([]byte, error)
TulisBerkas(path string, data []byte) error
}
4. Sensitivitas Huruf Besar dan Pengenal yang Diekspor
4.1. Nama yang Diekspor vs Tidak Diekspor
Dalam Go, visibilitas pengenal di luar paketnya ditentukan oleh huruf pertamanya. Sebuah pengenal yang diawali dengan huruf kapital adalah 'diekspor', artinya dapat diakses dari paket lain. Hal ini mirip dengan cakupan publik dalam bahasa pemrograman lain. Di sisi lain, pengenal yang diawali dengan huruf kecil adalah 'tidak diekspor' atau pribadi, dan hanya dapat diakses dalam paket mereka sendiri.
Contoh:
package geometri
// Pengenal yang diekspor
type PersegiPanjang struct {
Panjang, Lebar float64
}
// Pengenal yang tidak diekspor
type titik struct {
x, y float64
}
Pada contoh ini, PersegiPanjang
adalah tipe yang diekspor karena dimulai dengan huruf kapital dan dapat digunakan oleh paket lain yang mengimpor paket geometri
. Sebaliknya, tipe titik
tidak diekspor dan hanya dapat digunakan dalam paket geometri
.
4.2. Praktik Terbaik untuk Identifier yang Diimpor
Saat memberi nama pada identifier yang diimpor, sangat penting untuk mengikuti beberapa praktik terbaik agar kode Anda mudah dibaca dan dipahami oleh orang lain:
-
Ketegasan Lebih Penting dari Singkat: Pilih nama yang jelas dan deskriptif daripada yang pendek dan samar. Sebagai contoh,
HitungLuas
lebih disukai daripadaHitLuas
. - Konsistensi: Berpegang teguh pada konvensi penamaan di seluruh basis kode Anda. Jika Anda memulai dengan pola penamaan entitas yang mirip, tetaplah konsisten.
-
Hindari Redundansi: Jangan ulangi nama paket dalam nama identifier. Sebagai contoh, gunakan
geometri.PersegiPanjang
daripadageometri.GeometriPersegiPanjang
. - Perhatikan Konteks: Nama identifier seharusnya masuk akal dalam konteks penggunaannya. Hindari nama-nama yang dapat menyesatkan atau ambigu.
- Komentar Dokumentasi: Gunakan komentar untuk mendokumentasikan identifier yang diimpor, menjelaskan apa yang mereka lakukan dan bagaimana mereka seharusnya digunakan.
Contoh:
package geometri
// HitungLuas mengembalikan luas dari persegi panjang.
func (r PersegiPanjang) HitungLuas() float64 {
return r.Panjang * r.Lebar
}
Dalam contoh ini, HitungLuas
adalah sebuah fungsi yang diimpor dengan nama yang jelas dan deskriptif yang mencakup komentar dokumentasi yang menjelaskan tujuannya.
5. Konvensi Penamaan dalam Praktek
Di bab ini, kita akan melihat penerapan konvensi penamaan Go dalam skenario dunia nyata. Memahami dan mematuhi konvensi-konvensi ini sangat penting karena ini memastikan bahwa kode Anda idiomatik, mudah dibaca, dan mudah dipelihara.
5.1. Kesalahan Umum dan Cara Menghindarinya
Memberi nama variabel, fungsi, dan identifier lain seringkali dianggap remeh dalam kepentingannya. Kesalahan umum termasuk:
-
Menggunakan nama-nama generik: Nama-nama seperti
data
atauinfo
tidak deskriptif dan dapat menyebabkan kebingungan. - Nama yang terlalu panjang: Meskipun nama-nama yang deskriptif adalah baik, nama-nama yang terlalu panjang bisa merepotkan. Cari keseimbangan.
- Garis bawah dalam identifier dengan beberapa kata: Go lebih menyukai camelCase untuk nama variabel dan PascalCase untuk fungsi dan tipe yang diimpor.
- Pola penamaan yang tidak konsisten: Konsistensi dalam konvensi penamaan membantu memahami struktur kode dengan cepat.
Tips untuk menghindari kesalahan-kesalahan ini:
- Gunakan nama-nama yang ringkas namun deskriptif. Sebagai contoh, daripada
data
, gunakandataPengguna
jika berisi informasi tentang pengguna. - Ikuti konvensi Go untuk akronim; pertahankan huruf kapital, seperti
ServerHTTP
daripadaServerHttp
. - Untuk variabel dan konstanta level paket yang tidak diimpor, pertahankan nama-nama pendek karena cakupannya terbatas.
5.2. Refaktorisasi untuk Nama yang Lebih Baik
Merefaktorisasi kode untuk meningkatkan nama identifier dapat secara signifikan meningkatkan kejelasan kode. Berikut adalah cara melakukannya dengan aman:
-
Gunakan nama yang deskriptif: Refaktor nama agar dengan jelas menyatakan apa yang mereka wakili atau lakukan. Sebagai contoh, ganti nama fungsi dari
Proses
menjadiProsesMasukanPengguna
jika itulah yang dilakukannya. -
Manfaatkan alat-alat: Gunakan alat seperti
gorename
yang memungkinkan penggantian nama dengan aman dengan menganalisis kode Go secara semantik daripada secara tekstual. - Ulasan dengan rekan: Terkadang apa yang masuk akal bagi Anda mungkin tidak jelas bagi orang lain. Ulasan rekan dapat membantu mengidentifikasi nama-nama yang ambigu.
- Iterasi atas umpan balik: Setelah melakukan perubahan, kumpulkan umpan balik dari pengguna basis kode dan iterasikan pada penamaan jika diperlukan.
Dengan mengikuti teknik-teknik ini, Anda akan memastikan bahwa basis kode Go Anda tetap bersih, mudah dipahami, dan mudah dipelihara.