On this page
Naming, ฟังก์ชันที่ดี & Docstring
เขียนโค้ดให้คน "อ่าน" เข้าใจ ไม่ใช่แค่ให้เครื่อง "รัน" ได้ — เริ่มที่ชื่อและฟังก์ชัน
โค้ดถูกอ่านบ่อยกว่าถูกเขียนหลายเท่า การตั้งชื่อดีและแบ่งฟังก์ชันให้เหมาะจึงสำคัญมาก หัวข้อนี้คือพื้นฐานของ clean code ที่ส่งผลต่อทุกบรรทัดที่คุณเขียน
ตั้งชื่อให้สื่อความหมาย
ชื่อที่ดีบอกได้เลยว่าตัวแปร/ฟังก์ชันคืออะไร โดยไม่ต้องเดาหรืออ่านโค้ดข้างใน
# ❌ ต้องเดาว่าอะไรคืออะไร
d = 86400
for x in lst:
if x[2] > 18:
r.append(x)
# ✅ อ่านแล้วเข้าใจทันที
SECONDS_PER_DAY = 86400
for user in users:
if user["age"] > ADULT_AGE:
adults.append(user)ตัวเลขลอย ๆ ในโค้ด (เช่น 18, 86400, 0.07) ทำให้คนอ่านไม่รู้ความหมาย ตั้งเป็นค่าคงที่ชื่อสื่อความหมาย เช่น ADULT_AGE = 18, VAT_RATE = 0.07 แล้วใช้ชื่อแทน
ฟังก์ชันทำอย่างเดียว (Single Responsibility)
ฟังก์ชันที่ดีทำหน้าที่เดียว สั้น และชื่อบอกชัดว่าทำอะไร ถ้าฟังก์ชันยาวหรือทำหลายเรื่อง ให้แตกเป็นฟังก์ชันย่อย
# ❌ ฟังก์ชันเดียวทำหลายเรื่อง
def process(users):
for u in users:
if "@" in u["email"]: # validate
u["email"] = u["email"].lower() # normalize
send_email(u["email"]) # ส่งเมล
# ✅ แตกเป็นฟังก์ชันที่ทำอย่างเดียว ชื่อบอกหน้าที่
def is_valid_email(email):
return "@" in email
def normalize_email(email):
return email.lower()
def notify_users(users):
for u in users:
if is_valid_email(u["email"]):
send_email(normalize_email(u["email"]))Docstring & การอ่าน documentation
docstring คือคำอธิบายฟังก์ชัน/คลาส/โมดูล เขียนในสามเครื่องหมายคำพูด บอกว่าทำอะไร รับอะไร คืนอะไร — เครื่องมือและ help() อ่านได้
def calculate_discount(price, percent):
"""คำนวณราคาหลังหักส่วนลด
Args:
price: ราคาเต็ม (บาท)
percent: เปอร์เซ็นต์ส่วนลด (0-100)
Returns:
ราคาหลังหักส่วนลด
"""
return price * (1 - percent / 100)
help(calculate_discount) # แสดง docstringcomment ที่ดีอธิบาย "ทำไม" (เหตุผล/บริบท) ไม่ใช่ "อะไร" (ซึ่งโค้ดที่ตั้งชื่อดีควรบอกเองอยู่แล้ว) ส่วน docstring ใช้บอก contract ของฟังก์ชัน — คนละเรื่องกับ comment อธิบายบรรทัด
สรุปหัวข้อนี้
- ตั้งชื่อสื่อความหมาย เลี่ยง magic number (ตั้งเป็นค่าคงที่)
- ฟังก์ชันทำอย่างเดียว สั้น ชื่อบอกหน้าที่ — ยาว/หลายเรื่องให้แตกย่อย
- docstring บอก contract (ทำอะไร/รับ/คืน); comment บอก "ทำไม"
- ถ้าต้องคอมเมนต์อธิบายว่าโค้ดทำอะไร = ตั้งชื่อยังไม่ดีพอ
1) refactor โค้ดที่ตั้งชื่อแย่ (a, x, tmp) ให้สื่อความหมาย 2) หา magic number ในโค้ดแล้วตั้งเป็นค่าคงที่ 3) แตกฟังก์ชันที่ทำหลายเรื่องเป็นฟังก์ชันย่อย 4) เขียน docstring ให้ฟังก์ชันพร้อม Args/Returns