On this page
Refactoring
ปรับปรุงโครงสร้างโค้ดให้ดีขึ้นโดยไม่เปลี่ยนพฤติกรรม — ทำได้อย่างปลอดภัยเมื่อมีเทสต์
refactoring คือการปรับโครงโค้ดให้สะอาด/อ่านง่ายขึ้น โดย "พฤติกรรมเหมือนเดิม" ผลลัพธ์ไม่เปลี่ยน เป็นการลงทุนเพื่อให้แก้ต่อง่ายในอนาคต และทำได้อย่างมั่นใจเมื่อมีเทสต์รองรับ
refactor ต้องมีเทสต์ก่อน
ก่อนปรับโครงสร้าง ต้องมีเทสต์ที่ยืนยันว่าโค้ดทำงานถูก (จากบท Testing) เพื่อให้รู้ทันทีว่าการปรับทำให้พฤติกรรมเปลี่ยนหรือไม่ — refactor โดยไม่มีเทสต์คือเดินบนเส้นลวดไม่มีตาข่าย
Guard Clause — ลด nesting
เทคนิคที่ใช้บ่อยสุด: เช็คเงื่อนไขที่ไม่ผ่านแล้ว return ออกก่อน (early return) แทนการห่อทุกอย่างใน if ลึก ๆ
# ❌ 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.05Extract Function / Variable
ดึงโค้ดที่ซับซ้อนหรือซ้ำออกเป็นฟังก์ชัน/ตัวแปรที่มีชื่อ ทำให้อ่านเข้าใจขึ้นทันที
# ❌ เงื่อนไขซับซ้อนอ่านยาก
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 หลายอย่างรวดเดียว — ปรับทีละขั้นเล็ก ๆ แล้วรันเทสต์ยืนยันว่ายังเขียว ถ้าพังจะรู้ทันทีว่าขั้นไหนทำพัง (เชื่อมกลยุทธ์ debug บท 3: แก้ทีละอย่าง)
สรุปหัวข้อนี้
- refactor = ปรับโครงให้ดีขึ้น พฤติกรรมเหมือนเดิม
- ต้องมีเทสต์ก่อนเสมอ — เป็นตาข่ายว่าไม่ทำพฤติกรรมพัง
- guard clause (early return) ลด nesting ให้อ่านง่าย
- extract function/variable, rename — ปรับทีละขั้นแล้วรันเทสต์
1) refactor ฟังก์ชันที่ if ซ้อนลึกด้วย guard clause 2) extract เงื่อนไขซับซ้อนเป็นฟังก์ชันที่มีชื่อ 3) หาโค้ดที่ตั้งชื่อแย่แล้ว rename 4) อธิบายว่าทำไมต้องมีเทสต์ก่อน refactor