Go: ว่าด้วยเรื่อง ชื่อตัวแปร สั้นๆ

Weerasak Chongnguluam
รูปจากงาน GO GET TH #5 https://www.facebook.com/pg/gogetth

เรารู้กันอยู่แล้วว่าการตั้งชื่อนั้นสำคัญมากแค่ไหนในการเขียนโปรแกรมให้คนอื่นและตัวคนเขียนเอง อ่านรู้เรื่อง แต่ชื่อที่ดีและอ่านรู้เรื่อง ก็ไม่จำเป็นต้องยาวเสมอไป

สำหรับใครที่ย้ายมาเขียน Go ใหม่ๆ โดยที่เขียนภาษาอื่นมาก่อนแล้วนั้น จะค่อนข้างรู้สึกว่ามันใช่เหรอ มันดีแล้วเหรอ เวลาเจอโค้ดง่ายๆแบบนี้

func sumInts(nums []int) int {
total := 0
for i := range nums {
total += nums[i]
}
return total
}

หรือแบบนี้ (โค้ดจาก https://golang.org/pkg/strings/#LastIndexByte)

// LastIndexByte returns the index of the last instance of c in s, or -1 if c is not present in s.
func LastIndexByte(s string, c byte) int {
for i := len(s) - 1; i >= 0; i-- {
if s[i] == c {
return i
}
}
return -1
}

จากโค้ดข้างบนแม้ว่าตัวแปร i, s, c จะมีแค่ตัวอักษรเดียว แต่เราก็รู้ว่ามันแทนอะไร i แทน index ของ slice เวลา วนลูป , s แทน string ที่รับเข้ามา, c แทน byte ที่รับเขามาเพื่อเอาไปค้นหาใน string

ทำไมเรายังอ่านเข้าใจ?

ที่เราเข้าใจเพราะมันมีบริบทอื่นๆประกอบด้วยเช่น แทบทุกภาษา หรือตำราเรียนที่ผ่านๆมา ก็ i แทน index ของ Array กันอยู่แล้ว

ส่วน s และ c เราเห็น type ของมันอยู่แล้วว่าเป็นอะไร แล้วก็ฟังก์ชันมันก็สั้นๆ ชื่อฟังก์ชันก็สื่ออยู่แล้วว่าจะเอา s และ c ไปทำอะไร ไหนจะมี document อธิบายอีกนิดหน่อยตรงบรรทัดก่อนชื่อฟังก์ชันอีก

แนวคิดนี้ไม่ใช่ของใหม่อะไร Rob Pike (ใช่ Rob Pike คนเดียวกันกับที่สร้างภาษา Go นั่นแหละครับ) เขียนบทความเกี่ยวกับเรื่องนี้ไว้ตั้งแต่ปี 1989 (30 ปีที่แล้ว) เรื่อง Notes on Programming in C ในส่วนเรื่อง Variables names ผมยกส่วนที่เป็นสรุป มาไว้ตรงนี้เลยแล้วกันไม่แปล ส่วนที่เหลือลองอ่านกันดูเอาเอง

Finally, I prefer minimum­length but maximum­information names, and then let the context fill in the rest. Globals, for instance, typically have little context when they are used, so their names need to be relatively evocative. Thus I say maxphysaddr (not MaximumPhysicalAddress) for a global variable, but np not NodePointer for a pointer locally defined and used. This is largely a matter of taste, but taste is relevant to clarity.

ใน Wiki ของ Go เรื่อง Go Code Review Comments ก็มีกล่าวถึงเรื่องชื่อตัวแปรไว้เช่นกันว่า

Variable names in Go should be short rather than long. This is especially true for local variables with limited scope. Prefer c to lineCount. Prefer i to sliceIndex.

The basic rule: the further from its declaration that a name is used, the more descriptive the name must be. For a method receiver, one or two letters is sufficient. Common variables such as loop indices and readers can be a single letter (i, r). More unusual things and global variables need more descriptive names.

สรุปว่า ชื่อตัวแปรไม่ว่าจะสั้นหรือยาว ก็ต้องดูบริบท (context) ด้วยว่าเพียงพอต่อความเข้าใจหรือไม่ ยังไงก็แล้วแต่อย่าลืมรีวิวกันเองในทีมด้วย และต้องมีความ consistency ในการตั้งชื่อกันด้วยในโปรเจ็คเดียวกัน ถ้านานๆไปเจออะไรที่ปรับปรุงได้ในเรื่องชื่อก็ควรปรับด้วย แค่นั้นเองครับ

Weerasak Chongnguluam

Written by

I’m a Programmer.

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade