Notes & software courses · Free to learn
Aph's Blog
On this page

Naming, ฟังก์ชันที่ดี & Docstring

👋 อ่านฟรีทั้งหมดบน Aph's Blog — เนื้อหาภาษาไทย ทำตามทีละหน้าใน sidebar ได้เลย หากมีข้อเสนอแนะหรืออยากให้เพิ่มหัวข้อไหน บอกได้เสมอ

เขียนโค้ดให้คน "อ่าน" เข้าใจ ไม่ใช่แค่ให้เครื่อง "รัน" ได้ — เริ่มที่ชื่อและฟังก์ชัน

โค้ดถูกอ่านบ่อยกว่าถูกเขียนหลายเท่า การตั้งชื่อดีและแบ่งฟังก์ชันให้เหมาะจึงสำคัญมาก หัวข้อนี้คือพื้นฐานของ clean code ที่ส่งผลต่อทุกบรรทัดที่คุณเขียน

ตั้งชื่อให้สื่อความหมาย

ชื่อที่ดีบอกได้เลยว่าตัวแปร/ฟังก์ชันคืออะไร โดยไม่ต้องเดาหรืออ่านโค้ดข้างใน

python
# ❌ ต้องเดาว่าอะไรคืออะไร
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)
เลี่ยง magic number

ตัวเลขลอย ๆ ในโค้ด (เช่น 18, 86400, 0.07) ทำให้คนอ่านไม่รู้ความหมาย ตั้งเป็นค่าคงที่ชื่อสื่อความหมาย เช่น ADULT_AGE = 18, VAT_RATE = 0.07 แล้วใช้ชื่อแทน

ฟังก์ชันทำอย่างเดียว (Single Responsibility)

ฟังก์ชันที่ดีทำหน้าที่เดียว สั้น และชื่อบอกชัดว่าทำอะไร ถ้าฟังก์ชันยาวหรือทำหลายเรื่อง ให้แตกเป็นฟังก์ชันย่อย

python
# ❌ ฟังก์ชันเดียวทำหลายเรื่อง
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() อ่านได้

python
def calculate_discount(price, percent):
    """คำนวณราคาหลังหักส่วนลด

    Args:
        price: ราคาเต็ม (บาท)
        percent: เปอร์เซ็นต์ส่วนลด (0-100)
    Returns:
        ราคาหลังหักส่วนลด
    """
    return price * (1 - percent / 100)

help(calculate_discount)   # แสดง docstring
ถ้าต้องคอมเมนต์อธิบายว่าโค้ดทำอะไร แปลว่าตั้งชื่อยังไม่ดีพอ

comment ที่ดีอธิบาย "ทำไม" (เหตุผล/บริบท) ไม่ใช่ "อะไร" (ซึ่งโค้ดที่ตั้งชื่อดีควรบอกเองอยู่แล้ว) ส่วน docstring ใช้บอก contract ของฟังก์ชัน — คนละเรื่องกับ comment อธิบายบรรทัด

สรุปหัวข้อนี้

  • ตั้งชื่อสื่อความหมาย เลี่ยง magic number (ตั้งเป็นค่าคงที่)
  • ฟังก์ชันทำอย่างเดียว สั้น ชื่อบอกหน้าที่ — ยาว/หลายเรื่องให้แตกย่อย
  • docstring บอก contract (ทำอะไร/รับ/คืน); comment บอก "ทำไม"
  • ถ้าต้องคอมเมนต์อธิบายว่าโค้ดทำอะไร = ตั้งชื่อยังไม่ดีพอ
แบบฝึกหัด

1) refactor โค้ดที่ตั้งชื่อแย่ (a, x, tmp) ให้สื่อความหมาย 2) หา magic number ในโค้ดแล้วตั้งเป็นค่าคงที่ 3) แตกฟังก์ชันที่ทำหลายเรื่องเป็นฟังก์ชันย่อย 4) เขียน docstring ให้ฟังก์ชันพร้อม Args/Returns