Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> JavaScript

ควรจบ Switch Statement ด้วย Default Case ไหม? (Best Practice)

ใช่ ควรจบ switch ด้วย default case เสมอ เป็น Best Practice ที่ยอมรับทั่วไป เพราะ:

  1. จับค่าที่ไม่คาดคิด (Catch Unexpected Values) - ป้องกัน Bug เงียบๆ ที่โค้ด "หลุด" ไปทำงานต่อโดยไม่ได้จัดการค่านั้น
  2. Explicit Intent - บอกว่า "ค่าอื่นๆ ทั้งหมด ทำแบบนี้" ชัดเจน
  3. Maintainability - เพิ่ม Case ใหม่ในอนาคต ไม่ลืมจัดการ Fallback
  4. Static Analysis / Linting: ESLint Rule default-case และ default-case-last แจ้งเตือนหากขาด

ตัวอย่าง: Switch พร้อม Default

<script>
var grade = 'A';
document.write("Entering switch block<br>");

switch (grade) {
  case 'A': document.write("Good job<br>"); break;
  case 'B': document.write("Pretty good<br>"); break;
  case 'C': document.write("Passed<br>"); break;
  case 'D': document.write("Not so good<br>"); break;
  case 'F': document.write("Failed<br>"); break;
  default: document.write("Unknown grade: " + grade + "<br>"); // จับ 'Z', '1', null, undefined ฯลฯ
}

document.write("Exiting switch block");
</script>

กรณีที่อาจ "ไม่ต้อง" Default (แต่ควรมี Comment)

  • Enum/Type ที่ Exhaustive แล้ว (TypeScript switch บน Union Type ที่ครอบคลุมหมด) - Compiler จะแจ้ง Error หากขาด Case
  • Intentional Fall-through (มี Comment // fall through) - แต่ก็ควรมี Default สำหรับค่าที่ไม่ได้ Define
// TypeScript Example - Exhaustiveness Checking
type Status = 'pending' | 'success' | 'error';

function handle(status: Status) {
  switch (status) {
    case 'pending': return '⏳';
    case 'success': return '✅';
    case 'error': return '❌';
    // default: ไม่ต้องเขียน TypeScript จะ Error หากเพิ่ม Status ใหม่โดยไม่ Update Switch
  }
}

Default Case ควรทำอะไร?

  • Log Warning/Error: console.warn('Unexpected value:', value)
  • Throw Error: throw new Error(\`Invalid value: \${value}\`) (Fail Fast)
  • Fallback Behavior: ค่า Default ที่ปลอดภัย (Safe Default)
  • Analytics/Telemetry: ส่ง Metric ว่ามีค่าผิดปกติเข้ามา

Fall-through Design (Intentional)

switch (status) {
  case 'admin':
  case 'moderator':
  case 'editor':
    return 'staff'; // Fall-through จงใจ
  case 'user':
    return 'member';
  default:
    return 'guest'; // จับค่าอื่นๆ ทั้งหมด
}

สรุป

  • ควรมี default: ทุก switch statement (ยกเว้น TypeScript Exhaustive Switch)
  • วาง default: ท้ายสุดเสมอ (default-case-last)
  • ใน Default ให้ Log, Throw, หรือ Fallback อย่างชัดเจน อย่าว่างเปล่า
  • เปิด ESLint Rules: "default-case": "error", "default-case-last": "error"