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

Refactoring

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

ปรับปรุงโครงสร้างโค้ดให้ดีขึ้นโดยไม่เปลี่ยนพฤติกรรม — ทำได้อย่างปลอดภัยเมื่อมีเทสต์

refactoring คือการปรับโครงโค้ดให้สะอาด/อ่านง่ายขึ้น โดย "พฤติกรรมเหมือนเดิม" ผลลัพธ์ไม่เปลี่ยน เป็นการลงทุนเพื่อให้แก้ต่อง่ายในอนาคต และทำได้อย่างมั่นใจเมื่อมีเทสต์รองรับ

refactor ต้องมีเทสต์ก่อน

ก่อนปรับโครงสร้าง ต้องมีเทสต์ที่ยืนยันว่าโค้ดทำงานถูก (จากบท Testing) เพื่อให้รู้ทันทีว่าการปรับทำให้พฤติกรรมเปลี่ยนหรือไม่ — refactor โดยไม่มีเทสต์คือเดินบนเส้นลวดไม่มีตาข่าย

Guard Clause — ลด nesting

เทคนิคที่ใช้บ่อยสุด: เช็คเงื่อนไขที่ไม่ผ่านแล้ว return ออกก่อน (early return) แทนการห่อทุกอย่างใน if ลึก ๆ

python
# ❌ nested ลึก อ่านยาก
def get_discount(user):
    if user is not None:
        if user.is_active:
            if user.is_member:
                return 0.1
            else:
                return 0.05
    return 0

# ✅ guard clause: จัดการเคสที่ไม่ผ่านก่อน แล้วโฟลว์หลักแบนราบ
def get_discount(user):
    if user is None:
        return 0
    if not user.is_active:
        return 0
    if user.is_member:
        return 0.1
    return 0.05

Extract Function / Variable

ดึงโค้ดที่ซับซ้อนหรือซ้ำออกเป็นฟังก์ชัน/ตัวแปรที่มีชื่อ ทำให้อ่านเข้าใจขึ้นทันที

python
# ❌ เงื่อนไขซับซ้อนอ่านยาก
if user.age >= 18 and user.country == "TH" and user.verified:
    approve()

# ✅ extract เป็นตัวแปร/ฟังก์ชันที่มีชื่อ
def is_eligible(user):
    return user.age >= 18 and user.country == "TH" and user.verified

if is_eligible(user):
    approve()

เทคนิค refactor ที่ใช้บ่อย

  • Extract Function — ดึงโค้ดเป็นฟังก์ชันที่มีชื่อ
  • Extract Variable — ตั้งชื่อให้นิพจน์ซับซ้อน
  • Rename — เปลี่ยนชื่อให้สื่อความหมาย
  • Guard Clause — early return ลด nesting
  • Replace Magic Number — ใช้ค่าคงที่แทนตัวเลขลอย
refactor ทีละขั้น + รันเทสต์

อย่า refactor หลายอย่างรวดเดียว — ปรับทีละขั้นเล็ก ๆ แล้วรันเทสต์ยืนยันว่ายังเขียว ถ้าพังจะรู้ทันทีว่าขั้นไหนทำพัง (เชื่อมกลยุทธ์ debug บท 3: แก้ทีละอย่าง)

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

  • refactor = ปรับโครงให้ดีขึ้น พฤติกรรมเหมือนเดิม
  • ต้องมีเทสต์ก่อนเสมอ — เป็นตาข่ายว่าไม่ทำพฤติกรรมพัง
  • guard clause (early return) ลด nesting ให้อ่านง่าย
  • extract function/variable, rename — ปรับทีละขั้นแล้วรันเทสต์
แบบฝึกหัด

1) refactor ฟังก์ชันที่ if ซ้อนลึกด้วย guard clause 2) extract เงื่อนไขซับซ้อนเป็นฟังก์ชันที่มีชื่อ 3) หาโค้ดที่ตั้งชื่อแย่แล้ว rename 4) อธิบายว่าทำไมต้องมีเทสต์ก่อน refactor