Dark mode
Refactoring (การปรับปรุงโค้ด)
บทนำ
การปรับปรุงโค้ด (Refactoring) คือกระบวนการปรับโครงสร้างโค้ดให้มีคุณภาพดีขึ้นโดยไม่เปลี่ยนพฤติกรรมภายนอก ช่วยให้โค้ดอ่านง่าย บำรุงรักษาง่ายขึ้น และลดข้อผิดพลาด
เหตุผลที่ต้องปรับปรุงโค้ด
- เพิ่มความเข้าใจ - โค้ดที่อ่านง่ายช่วยให้ทีมเข้าใจได้เร็วขึ้น
- ลดความซับซ้อน - ทำให้โค้ดง่ายต่อการแก้ไขและขยายฟีเจอร์
- ลดข้อผิดพลาด - ลดโอกาสเกิดบัグจากการเข้าใจผิด
- เพิ่มประสิทธิภาพ - โอกาสในการปรับปรุงประสิทธิภาพ
กลิ่นของโค้ด (Code Smells)
1. ฟังก์ชันที่ยาวเกินไป
- ปัญหา: ฟังก์ชันที่ยาวเกินไปเข้าใจยาก
- การแก้ไข: แยกเป็นฟังก์ชันย่อยที่มีความหมายชัดเจน
2. ตัวแปรชั่วคราวมากเกินไป
- ปัญหา: ใช้ตัวแปรชั่วคราวมากเกินความจำเป็น
- การแก้ไข: ใช้ Query Method หรือ Inline Temp
3. พารามิเตอร์จำนวนมาก
- ปัญหา: ฟังก์ชันรับพารามิเตอร์มากเกินไป
- การแก้ไข: จัดกลุ่มพารามิเตอร์เป็น Object
เทคนิคการปรับปรุงโค้ด
1. Extract Method
ก่อน:
typescript
function printOwing(amount: number) {
printBanner();
// Print details
console.log(`name: ${name}`);
console.log(`amount: ${amount}`);
}
หลัง:
typescript
function printOwing(amount: number) {
printBanner();
printDetails(amount);
}
function printDetails(amount: number) {
console.log(`name: ${name}`);
console.log(`amount: ${amount}`);
}
2. Rename Variable
ก่อน:
typescript
const a = height * width; // area of rectangle
หลัง:
typescript
const area = height * width;
3. Replace Magic Number with Symbolic Constant
ก่อน:
typescript
if (temperature > 100) {
// 100 คืออะไร?
console.log("Boiling");
}
หลัง:
typescript
const BOILING_POINT = 100;
if (temperature > BOILING_POINT) {
console.log("Boiling");
}
ตัวอย่างการปรับปรุงโค้ด
ตัวอย่างที่ 1: แยกเงื่อนไขที่ซับซ้อน
ก่อน:
typescript
function calculateDiscount(customer: Customer, products: Product[]): number {
let discount = 0;
if (
customer.type === "premium"
&& products.length > 5
&& customer.purchaseHistory.totalPurchases > 1000
) {
discount = 0.2;
} else if (customer.type === "regular" && products.length > 3) {
discount = 0.1;
}
return discount;
}
หลัง:
typescript
function calculateDiscount(customer: Customer, products: Product[]): number {
if (isEligibleForPremiumDiscount(customer, products)) {
return 0.2;
}
if (isEligibleForRegularDiscount(customer, products)) {
return 0.1;
}
return 0;
}
function isEligibleForPremiumDiscount(
customer: Customer,
products: Product[],
): boolean {
return customer.type === "premium"
&& products.length > 5
&& customer.purchaseHistory.totalPurchases > 1000;
}
function isEligibleForRegularDiscount(
customer: Customer,
products: Product[],
): boolean {
return customer.type === "regular" && products.length > 3;
}
เครื่องมือช่วยปรับปรุงโค้ด
- ESLint - ตรวจสอบและแก้ไขรูปแบบโค้ด
- Prettier - จัดรูปแบบโค้ดอัตโนมัติ
- TypeScript - ตรวจสอบประเภทข้อมูล
- Jest - ทดสอบการทำงานหลังปรับปรุงโค้ด
ขั้นตอนการปรับปรุงโค้ด
- มีชุดทดสอบ - ตรวจสอบว่ามีชุดทดสอบที่ครอบคลุม
- ทำทีละน้อย - เปลี่ยนทีละอย่างและทดสอบบ่อยๆ
- Commit บ่อยๆ - บันทึกการเปลี่ยนแปลงเป็นระยะ
- ตรวจสอบผลลัพธ์ - ตรวจสอบว่าการทำงานยังเหมือนเดิม
แนวทางปฏิบัติที่ดี
- ตั้งชื่อให้มีความหมาย - ชื่อตัวแปร ฟังก์ชัน และคลาสควรสื่อความหมาย
- ฟังก์ชันควรทำเพียงอย่างเดียว - Single Responsibility Principle
- ลดการซ้ำซ้อน - DRY (Don't Repeat Yourself)
- ทำให้ง่ายเข้าไว้ - KISS (Keep It Simple, Stupid)
แบบฝึกหัด
- ลองปรับปรุงโค้ดส่วนที่เคยเขียนให้อ่านง่ายขึ้น
- ใช้เครื่องมือตรวจสอบคุณภาพโค้ด
- ฝึกเขียน Unit Test สำหรับโค้ดที่ปรับปรุง
สรุป
การปรับปรุงโค้ดเป็นทักษะสำคัญที่ช่วยให้โค้ดมีคุณภาพดีขึ้นอย่างต่อเนื่อง ควรทำเป็นประจำและทำทีละน้อยเพื่อลดความเสี่ยงในการเกิดข้อผิดพลาด