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

DRY, KISS, YAGNI & Code Smells

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

หลักการคิดที่ทำให้โค้ดดูแลง่าย และสัญญาณเตือน (code smell) ว่าโค้ดเริ่มมีปัญหา

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

DRY — Don't Repeat Yourself

อย่าเขียนตรรกะเดียวกันซ้ำหลายที่ เพราะเวลาแก้ต้องตามแก้ทุกจุด (และมักลืม) ถ้าเห็นโค้ดซ้ำ ให้ดึงเป็นฟังก์ชัน

python
# ❌ ซ้ำ — แก้สูตรต้องตามแก้ 2 ที่
total_a = price_a + price_a * 0.07
total_b = price_b + price_b * 0.07

# ✅ ดึงเป็นฟังก์ชันเดียว
def with_vat(price):
    return price + price * 0.07

total_a = with_vat(price_a)
total_b = with_vat(price_b)

KISS & YAGNI

หลักย่อมาจากความหมาย
DRYDon't Repeat Yourselfอย่าเขียนซ้ำ ดึงเป็นจุดเดียว
KISSKeep It Simple, Stupidทำให้เรียบง่ายที่สุดเท่าที่ได้
YAGNIYou Aren't Gonna Need Itอย่าทำเผื่ออนาคตที่ยังไม่มา
over-engineering แย่พอ ๆ กับ under-engineering

มือใหม่ที่อยากโชว์มักทำโค้ดซับซ้อนเกินจำเป็น เผื่อเคสที่ไม่มีวันเกิด (ละเมิด KISS/YAGNI) — โค้ดที่เรียบง่ายและแก้ปัญหาตรงหน้าได้ ดีกว่าโค้ดยืดหยุ่นเกินจนไม่มีใครเข้าใจ

Code Smells — สัญญาณว่าโค้ดเริ่มเสีย

code smell คือลักษณะที่ "ส่อ" ว่าโค้ดอาจมีปัญหา ไม่ใช่ bug แต่เป็นสัญญาณว่าควรปรับ:

  • ฟังก์ชันยาวมาก (เกินจอ) — ทำหลายเรื่อง ควรแตก
  • พารามิเตอร์เยอะเกิน (4-5 ตัวขึ้น) — อาจรวมเป็น object
  • โค้ดซ้ำหลายที่ — ละเมิด DRY
  • ชื่อกำกวม (data, temp, info, manager)
  • comment เยอะผิดปกติ — มักเพราะโค้ดอ่านไม่รู้เรื่อง
  • nested ลึกหลายชั้น (if ใน if ใน for) — อ่านยาก

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

  • DRY: อย่าเขียนตรรกะซ้ำ ดึงเป็นฟังก์ชันเดียว
  • KISS: เรียบง่ายไว้ก่อน; YAGNI: อย่าทำเผื่ออนาคตที่ยังไม่มา
  • code smell = สัญญาณเตือน (ฟังก์ชันยาว, พารามิเตอร์เยอะ, ซ้ำ, ชื่อกำกวม, nested ลึก)
  • over-engineering แย่พอ ๆ กับทำน้อยเกิน
แบบฝึกหัด

1) หาโค้ดซ้ำในโปรเจกต์เก่าแล้วดึงเป็นฟังก์ชัน (DRY) 2) หา code smell ในโค้ดที่ให้มา 3 จุด 3) ยกตัวอย่างโค้ดที่ over-engineer แล้วทำให้ง่ายลง 4) อธิบาย KISS กับ YAGNI ด้วยคำตัวเอง