ใช่ ควรจบ switch ด้วย default case เสมอ เป็น Best Practice ที่ยอมรับทั่วไป เพราะ:
- จับค่าที่ไม่คาดคิด (Catch Unexpected Values) - ป้องกัน Bug เงียบๆ ที่โค้ด "หลุด" ไปทำงานต่อโดยไม่ได้จัดการค่านั้น
- Explicit Intent - บอกว่า "ค่าอื่นๆ ทั้งหมด ทำแบบนี้" ชัดเจน
- Maintainability - เพิ่ม Case ใหม่ในอนาคต ไม่ลืมจัดการ Fallback
- 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"