1. เข้าใจวิธีการตั้งชื่อ
การตั้งชื่อเป็นสิ่งสำคัญในการพัฒนาซอฟต์แวร์ เนื่องจากมันจะสร้างกรอบการตั้งชื่อของตัวแปร ฟังก์ชัน และตัวระบุอื่น ๆ ให้มีความสม่ำเสมอและอธิบายได้ตามลำดับ ใน Go (ซึ่งเรียกว่า Golang บ่อยครั้ง) การปฏิบัติตามหลักการการตั้งชื่อที่สร้างขึ้นไม่เพียงทำให้โค้ดของคุณง่ายต่อการอ่านและบำรุงรักษาเท่านั้น แต่ยังช่วยให้ผู้อื่น (และตัวเองในอนาคต) เข้าใจและร่วมมือกันในการสร้างโค้ดได้โดยไม่มีความเสียหาย
1.1. ทำไมการตั้งชื่อสำคัญ
ในภาษาโปรแกรมใดๆ วิธีที่คุณตั้งชื่อตัวระบุจะส่งผลต่อการเข้าใจและการบำรุงรักษาของโค้ดของคุณอย่างมาก ใน Go ซึ่งเน้นความง่ายและความชัดเจน การตั้งชื่อที่เหมาะสมมีความสำคัญมากยิ่งขึ้น ชื่อที่อธิบายเจตคติของตัวแปรหรือฟังก์ชันลดความจำเป็นในการมีความคิดเห็นเพิ่มเติม และทำให้โค้ดสามารถอธิบายตัวเองเองได้ สิ่งนี้สำคัญสำหรับการบำรุงรักษาโค้ดโดยเวลาและสำหรับการทำให้การทำงานร่วมกันในทีมเป็นไปอย่างราบรื่น
1.2. กฎทั่วไปสำหรับการตั้งชื่อ
กฎการตั้งชื่อใน Go เป็นไปอย่างชัดเจนและมีอำนาจ:
-
ใช้ชื่อสั้นและกระชับ: Go สนับสนุนการใช้ชื่อที่สั้นโดยเฉพาะสำหรับตัวแปรที่มีขอบเขตเล็ก ตัวอย่างเช่น
i
อาจถูกใช้สำหรับตัวนับลูป แต่index
หรือcounter
สามารถถูกใช้หากต้องการความชัดเจนมากขึ้น -
ใช้ CamelCase สำหรับชื่อที่มีหลายคำ: เมื่อชื่อประกอบด้วยหลายคำ ให้ใช้การบ่งบอก CamelCase Exported names (ชื่อที่ควรสามารถเข้าถึงนอกแพ็คเกจ) ควรเริ่มต้นด้วยตัวพิมพ์ใหญ่ (
MyFunction
) ในขณะที่ชื่อภายในควรเริ่มต้นด้วยตัวพิมพ์เล็ก (myFunction
) -
ใช้ชื่อที่มีความหมาย: ชื่อควรมีคำบรรยายอย่างพอเพียงเพื่อสื่อสารวัตถุประสงค์หรือการใช้งานโดยไม่ต้องเป็นเกินไป ตัวอย่างเช่น
CalculateNetIncome
ควรได้รับการความพิจารณามากกว่าCNI
-
หลีกเลี่ยงการใช้ under_scores: ในทางตรงข้ามกับบางภาษา แนวคิดของ Go หลีกเลี่ยงการใช้ขีดล่างในชื่อ แทนของ
record_count
คุณควรใช้recordCount
-
ตัวย่อควรเป็นแบบเดียวกัน: เมื่อใช้ตัวย่อในชื่อ ให้เก็บมันในตัวอักษรเดียวกัน สำหรับชื่อที่เข้าถึงได้ให้ใช้ตัวพิมพ์ใหญ่ทั้งหมด (
HTTPServer
) และสำหรับชื่อภายในให้ใช้ตัวพิมพ์เล็กทั้งหมด (httpServer
) เป็นการปฏิบัติที่มีความสากล -
ชื่อแพ็คเกจควรเป็นอย่างง่าย: ชื่อแพ็คเกจใน Go ถืออยู่ระดับง่ายและเป็นตัวพิมพ์เล็ก โดยไม่มีขีดล่างหรือ mixedCaps พวกเขาควรเป็นคำเดียวที่แสดงเจตคติของแพ็คเกจอย่างชัดเจน (
net
,os
,json
) -
การตั้งชื่อตัวแปรขึ้นอยู่กับประเภท: สำหรับตัวแปรที่แทนตัวอย่างของ struct จะใช้ชื่อของ struct เป็นชื่อตัวแปรโดยใช้ตัวพิมพ์เล็ก (
var user User
)
ต่อไปนี้คือตัวอย่างของโค้ด Go พร้อมความคิดเห็นที่อธิบายเรื่องวิธีการตั้งชื่อ:
package main
import "fmt"
type User struct {
FirstName string
LastName string
Age int
}
func main() {
var currentUser User // ใช้ชื่อ struct ในตัวแปรที่เริ่มด้วยตัวพิมพ์เล็ก
currentUser.FirstName = "John"
currentUser.LastName = "Doe"
currentUser.Age = 30
fmt.Println(formatUserDetails(currentUser))
}
// formatUserDetails รับ struct User เป็นอินพุทและคืนค่าเป็นสตริงรูปแบบกลับ
// ชื่อฟังก์ชันเริ่มด้วยตัวพิมพ์เล็กเนื่องจากมันไม่ถูกส่งออก (เป็นส่วนตัว)
func formatUserDetails(u User) string {
return fmt.Sprintf("Name: %s %s, Age: %d", u.FirstName, u.LastName, u.Age)
}
การปฏิบัติตามกฎการตั้งชื่อเหล่านี้จะทำให้คุณมีโค้ด Go ที่มีคุณภาพดีมาก โดยทำให้มันอ่านง่ายและสามารถบำรุงรักษาได้
2. ตัวระบุใน Go
เมื่อคุณเริ่มต้นการเดินทางของคุณด้วย Go มันเป็นสิ่งจำเป็นที่จะเข้าใจบทบาทของตัวระบุ ตัวระบุเป็นชื่อที่คุณกำหนดให้กับองค์ประกอบต่าง ๆ ในโค้ดของคุณ เช่น ตัวแปร ฟังก์ชัน และค่าคงที่ การเลือกใช้ชื่อที่มีความหมายและสม่ำเสมอจะช่วยทำให้โค้ดของคุณมีความอ่านได้และสามารถบำรุงรักษาได้เป็นอย่างมาก
2.1. กฎการตั้งชื่อตัวแปร
ใน Go ชื่อตัวแปรต้องขึ้นต้นด้วยตัวอักษรหรือขีดล่าง ตามด้วยการผสมชื่อที่เป็นตัวอักษร ตัวเลข หรือขีดล่าง แต่ไม่ควรขึ้นต้นด้วยขีดล่างเนื่องจากมักเป็นการสงวนไว้สำหรับการใช้พิเศษ
Best Practices:
- ใช้ชื่อที่สั้นและแจ่มแจ้ง
- ขึ้นต้นด้วยตัวพิมพ์เล็กสำหรับขอบเขตระดับแพ็คเกจ
- ใช้ CamelCase สำหรับชื่อที่มีหลายคำ ( เช่น
totalAmount
) - สำหรับตัวแปรที่สามารถเข้าถึงได้ภายนอกแพ็คเกจ ให้ขึ้นต้นด้วยตัวพิมพ์ใหญ่
ตัวอย่าง:
var userName string // ตัวแปรที่ไม่ได้ส่งออก
var UserAge int // ตัวแปรที่ส่งออก
ความเห็นในโค้ดอธิบายการแตกต่างระหว่างตัวแปรที่ส่งออกและไม่ส่งออก
2.2. มารยาทในการตั้งชื่อฟังก์ชัน
การตั้งชื่อใน Go ของฟังก์ชันจะเป็นตามกฎเดียวกันกับตัวแปร ชื่อควรสะท้อนวัตถุประสงค์ของฟังก์ชัน และขอบเขตของมันจะกำหนดตัวอักษรตัวแรก
Best Practices:
- ใช้ชื่อที่อธิบายได้อย่างชัดเจนที่สะท้อนวัตถุประสงค์ของฟังก์ชัน
- ขึ้นต้นด้วยตัวอักษรเล็กสำหรับฟังก์ชันภายใน
- ใช้ PascalCase (เริ่มต้นด้วยตัวอักษรใหญ่) สำหรับฟังก์ชันที่ส่งออก
- ใช้ชื่อฟังก์ชันอย่างกระชับแต่หมายความได้
Example:
func calculateTotal(price int, quantity int) int { // ฟังก์ชันภายใน
return price * quantity
}
func CalculateDiscount(totalPrice int) float64 { // ฟังก์ชันที่ส่งออก
return totalPrice * 0.1
}
ความคิดเห็นอธิบายถึงความเข้าถึงของฟังก์ชันขึ้นอยู่กับเคสและให้ความคิดฉลาดสั้นๆ เกี่ยวกับวัตถุประสงค์ของมัน
2.3. มารยาทในการตั้งชื่อค่าคงที่
ค่าคงที่เป็นค่าที่ไม่เปลี่ยนแปลงได้เมื่อกำหนดรายละเอียดแล้ว ใน Go ค่าคงที่ถูกประกาศโดยใช้คีย์เวิร์ด const
และสามารถเป็นตัวอักษร สตริง บูลีน หรือค่าตัวเลข
Best Practices:
- ใช้ตัวอักษรทั้งหมดเป็นตัวใหญ่พร้อมกับขีดล่างสำหรับการแยก (เช่น
MAX_LIMIT
) - สำหรับค่าคงที่ที่เป็นเลขเรียง ให้ใช้ตัวกำหนด
iota
- ค่าคงที่ที่ส่งออกควรขึ้นต้นด้วยตัวอักษรใหญ่
Example:
const MAX_RETRY_COUNT int = 3 // ค่าคงที่ที่ส่งออก
type ByteSize float64
const (
_ = iota // ละเว้นค่าแรกโดยการกำหนดให้ตัวแปรเป็นชื่อไม่มีบทบาท
KB ByteSize = 1 << (10 * iota)
MB
GB
TB
)
ตัวอย่างแสดงถึงการกำหนดค่าคงที่อย่างง่ายและชุดค่าคงที่ที่เกี่ยวข้องโดยใช้ iota
สำหรับขนาดไบต์
3. มารยาทการตั้งชื่อสำหรับประเภทต่างๆ
บทนี้เน้นไปที่มาตรฐานในการตั้งชื่อประเภทต่างๆ เช่น สตรัคต์ และอินเทอร์เฟซ
3.1. แนวทางในการตั้งชื่อสำหรับสตรัคต์
ภาพรวม: สตรัคต์ใน Go แทนด้วยประเภทข้อมูลที่รวมกันตัวแปร ในขณะที่ตั้งชื่อสตรัคต์ให้ใช้ชื่อที่อธิบายสิ่งที่พวกมันแทนในรูปแบบ PascalCase ซึ่งเริ่มต้นด้วยตัวอักษรใหญ
- การใช้จรรยาบรรณที่ดี: ตั้งชื่อสตรัคต์ด้วยคำนามหรือวลีคำนามที่อธิบายได้อย่างชัดเจนว่าพวกมันแทนสิ่งอะไร เช่น:
// ดี
type Employee struct {
ID int
FirstName string
LastName string
Position string
}
- ควรหลีกเลี่ยง: การใช้ชื่อที่กำกวมหรือทั่วไปซี่ไม่สื่อถึงวัตถุประสงค์ของสตรัคต์
// ควรหลีกเลี่ยง
type Data struct {
ID int
FirstName string
LastName string
Position string
}
3.2. แนวทางในการตั้งชื่อสำหรับอินเทอร์เฟซ
ภาพรวม: อินเทอร์เฟซใน Go ระบุชุดของเมทอด และตั้งชื่อโดยใช้ชื่ออธิบายที่สุดท้ายด้วยคำส่งลงท้ายด้วย 'er' หากเหมาะสม
- การใช้จรรยาบรรณที่ดี: ตั้งชื่ออินเทอร์เฟซตามพฤติกรรมที่มันชื่นชอบ โดยทั่วไปถ้าอินเทอร์เฟซมีเพียงเมทอดเดียว ชื่อควรสะท้อนพฤติกรรมของเมทอดนั้นรวมทั้งเออร์เองลงท้ายด้วย '-er'
// ดี
type Reader interface {
Read(p []byte) (n int, err error)
}
- การตั้งชื่อชุดของพฤติกรรม: หากอินเทอร์เฟซแทนชุดของพฤติกรรม ให้เลือกชื่อที่สะท้อนวัตถุประสงค์ของมันโดยไม่ต้องเออร์ลงท้ายด้วย 'er'
// ตัวอย่างของชุดของพฤติกรรม
type Filesystem interface {
ReadFile(path string) ([]byte, error)
WriteFile(path string, data []byte) error
}
4. ความอคติและการใช้ตัวบ่งชี้แบบตัวพิมพ์
4.1. ชื่อที่ส่งออกกับชื่อที่ไม่ส่งออก
ใน Go การเห็นขอบเขตของตัวบ่งชี้ของตัวเองอยู่ในแพ็คเกจของมันเองจะได้รับการกำหนดโดยตัวอักษรของตัวแรก ตัวบ่งชี้ที่ขึ้นต้นด้วยตัวอักษรใหญ่ถูกเรียกว่า 'ส่งออก' หมายความว่ามันสามารถเข้าถึงได้จากแพ็คเกจอื่น ๆ โดยการนำแพ็คเกจ 'geometry' มาใช้ ในขณะเดียวกัน ตัวบ่งชี้ที่ขึ้นต้นด้วยตัวอักษรเล็กถูกเรียกว่า 'ไม่ส่งออก' หรือส่วนตัว และพวกมันสามารถเข้าถึงได้เฉพาะในแพ็คเกจของมันเอง
ตัวอย่าง:
package geometry
// ตัวบ่งชี้ที่ส่งออก
type Rectangle struct {
Length, Width float64
}
// ตัวบ่งชี้ที่ไม่ส่งออก
type point struct {
x, y float64
}
ในตัวอย่างนี้ Rectangle
เป็นชนิดที่ส่งออกเพราะเริ่มต้นด้วยตัวอักษรใหญ่และสามารถใช้ได้จากแพ็คเกจอื่นๆ ที่นำแพ็คเกจ geometry
มาใช้ กลับกัน point
เป็นชนิดที่ไม่ส่งออกและสามารถใช้ได้เฉพาะในแพ็คเกจ geometry
เท่านั้น
4.2. ปฏิบัติที่ดีสำหรับตัวแสดงที่ส่งออก
เมื่อตั้งชื่อตัวแสดงที่ส่งออก มีความสำคัญที่จะทำตามปฏิบัติที่ดีบางรายเพื่อให้รหัสของคุณสามารถอ่านและเข้าใจได้โดยผู้อื่น:
-
ความชัดเจนกว่าความกระชับ: เลือกใช้ชื่อที่ชัดเจนและเกรงกว่าชื่อที่สั้นและลับ ตัวอย่างเช่น
CalculateArea
นั้นถือว่าดีกว่าCalcA
. - คงเดิม: ทำให้รูปแบบการตั้งชื่อเหมือนกันไปทั่วทั้งรหัสของคุณ หากคุณเริ่มต้นตั้งชื่อสิ่งที่คล้ายคลึงกันด้วยรูปแบบบางตัว คงให้มัน.
-
หลีกเลี่ยงความซ้ำซ้อน: อย่าทำซ้ำชื่อแพ็คเกจในชื่อตัวแสดง เช่น ใช้
geometry.Rectangle
แทนgeometry.GeometryRectangle
. - พิจารณาบริบท: ชื่อของตัวแสดงควรมีความหมายในบริบทที่พวกเขาถูกใช้ หลีกเลี่ยงชื่อที่อาจทำให้สับสนหรือกำกวม.
- คำอธิบายด้วยความคิด: ใช้คำอธิบายเพื่อเอกสารบันทึกตัวแสดงที่ส่งออก อธิบายว่าพวกเขาทำอะไรและควรถูกใช้อย่างไร.
ตัวอย่าง:
package geometry
// CalculateArea คืนค่าพื้นที่ของสี่เหลี่ยม.
func (r Rectangle) CalculateArea() float64 {
return r.Length * r.Width
}
ในตัวอย่างนี้ CalculateArea
เป็นฟังก์ชันที่ส่งออกที่มีชื่อที่ชัดเจนและคำอธิบายที่ระบุวัตถุประสงค์ของมัน.
5. การตั้งชื่อตามประสบการณ์ในการใช้งาน
ในบทนี้ เราจะลึกไปในการประยุกต์ใช้นิยมในการตั้งชื่อ Go ในสถานการณ์ในโลกจริง การเข้าใจและปฏิบัติตามนิยมนี้เป็นสำคัญเนื่องจากมันรับรองว่าโค้ดของคุณเป็นลำดับธรรม ง่ายต่อการอ่าน และบำรุงรักษา.
5.1. ข้อบกพร่องที่พบบ่อยและวิธีหลีกเลี่ยง
การตั้งชื่อตัวแปร ฟังก์ชัน และตัวแสดงอื่น ๆ มักถูกประมาณมูลค่าการใช้งานของมัน ข้อผิดพลาดที่พบบ่อยได้แก่:
-
ใช้ชื่อที่ทั่วไป: ชื่อเช่น
data
หรือinfo
ไม่เป็นทางการและสามารถทำให้สับสน. - ชื่อยาวเกินไป: ถึงแม้จะเป็นชื่อที่ให้คำอธิบายได้ดี ยาวมากเกินไปอาจทำให้ลำบาก ควรหาสมดุล.
- ขีดล่างในตัวแสดงหลายคำ: Go ชอบใช้ camelCase สำหรับชื่อตัวแปรและ PascalCase สำหรับฟังก์ชันที่ถูกส่งออก และประเภท.
- รูปแบบการตั้งชื่อที่ไม่สัมพันธ์กัน: ความสม่ำเสมอในรูปแบบการตั้งชื่อช่วยในการเข้าใจโค้ดโครงสร้างอย่างรวดเร็ว.
เคล็ดลับในการหลีกเลี่ยงข้อบกพร่องเหล่านี้:
- ใช้ชื่อที่กระชับและให้คำอธิบายได้ชัดเจน เช่น แทนที่จะใช้
data
ให้ใช้userData
หากมีข้อมูลเกี่ยวกับผู้ใช้. - ปฏิบัติตามแนวทางการใช้ไฟกโรของ Go สำหรับคำย่อ ให้เก็บไว้ในตัวพิมพ์ใหญ่ เช่น
HTTPServer
แทนHttpServer
. - สำหรับตัวแปรและค่าคงที่ในแพ็คเกจที่ไม่ได้ส่งออก ตั้งใช้ชื่อที่สั้นเพราะมันมีขอบเขตของความคาดหวัง.
5.2. การเปลี่ยนชื่อใหม่เพื่อปรับปรุง
การเปลี่ยนโค้ดเพื่อปรับชื่อตัวแสดงสามารถเสริมคุณสมบัติในการอ่านรหัสได้อย่างมีนัยสำคัญ นี่คือวิธีที่คุณสามารถทำได้อย่างปลอดภัย:
-
ใช้ชื่อที่ให้คำอธิบายได้: เปลี่ยนชื่อให้ชัดเจนว่ามันแทนอะไรหรือทำอะไร ตัวอย่างเช่น เปลี่ยนชื่อฟังก์ชันจาก
Process
เป็นProcessUserInput
หากมันทำงานเช่นนั้น. -
ใช้เครื่องมือ: ใช้เครื่องมือเช่น
gorename
ซึ่งช่วยในการเปลี่ยนชื่ออย่างปลอดภัยโดยการวิเคราะห์รหัส Go โดยการเขียนข้อความ. - ทบทวนกับเพื่อนร่วมงาน: บางครั้งสิ่งที่มันเข้าใจสำหรับคุณอาจไม่ชัดเจนสำหรับผู้อื่น การทบทวนด้วยเพื่อนร่วมงานสามารถช่วยในการระบุชื่อที่กำกวม.
- เปลี่ยนไปตามคำแนะนำ: หลังจากที่ทำการเปลี่ยนแล้วรวบรวมคำแนะนำจากผู้ใช้งานของโค้ดและเปลี่ยนไปตามคำแนะนำเพิ่มเติมหากจำเป็น.
โดยการปฏิบัติตามเทคนิคเหล่านี้ คุณจะทำให้รหัส Go ของคุณยังคงสะอาด และรักษาได้อย่างเห็นใจและสามารถบำรุงรักษาได้.