Refactoring เบื้องต้น: ทำความสะอาด Code ง่ายๆ
หลังจากที่เราได้เรียนรู้การเขียน Unit Test และการวัด Code Coverage ในบทก่อนๆ แล้ว สิ่งสำคัญอีกอย่างหนึ่งในการพัฒนาซอฟต์แวร์คือการ Refactoring หรือการปรับปรุงโค้ดให้ดีขึ้น โดยไม่เปลี่ยนแปลงผลลัพธ์การทำงานของมัน การ Refactoring ช่วยให้โค้ดของเราอ่านง่ายขึ้น เข้าใจง่ายขึ้น และง่ายต่อการแก้ไขและบำรุงรักษาในอนาคต
ในบทนี้ เราจะมาเรียนรู้เทคนิค Refactoring ง่ายๆ ที่คุณสามารถนำไปใช้ได้ทันที เพื่อปรับปรุงโค้ดของคุณให้สะอาดตาและมีประสิทธิภาพมากยิ่งขึ้น
Refactoring คืออะไร?
Refactoring คือกระบวนการปรับปรุงโครงสร้างภายในของโค้ด โดยไม่เปลี่ยนแปลงพฤติกรรมภายนอกของมัน พูดง่ายๆ คือการ "จัดระเบียบ" โค้ดให้ดูดีขึ้น ทำงานได้ดีขึ้น โดยที่โปรแกรมยังคงทำงานได้เหมือนเดิม
ทำไมต้อง Refactoring?
- อ่านง่ายขึ้น: โค้ดที่อ่านง่าย ช่วยให้เราเข้าใจการทำงานของมันได้เร็วขึ้น และลดโอกาสในการเกิดข้อผิดพลาด
- แก้ไขง่ายขึ้น: โค้ดที่จัดระเบียบดี ทำให้การแก้ไขและเพิ่มฟีเจอร์ใหม่ๆ ทำได้ง่ายขึ้น
- ลดความซับซ้อน: Refactoring ช่วยลดความซับซ้อนของโค้ด ทำให้โค้ดมีโครงสร้างที่ชัดเจนและเข้าใจได้ง่าย
- ป้องกันการเกิด Bug: โค้ดที่สะอาด มักจะลดโอกาสในการเกิด Bug หรือข้อผิดพลาด
Refactoring ไม่ใช่การแก้ไข Bug หรือการเพิ่มฟีเจอร์ใหม่ แต่มันคือการปรับปรุงโค้ดที่มีอยู่ให้ดีขึ้น
เทคนิค Refactoring ง่ายๆ
ต่อไปนี้คือเทคนิค Refactoring ที่คุณสามารถนำไปใช้ได้ง่ายๆ ในโปรเจกต์ PHP ของคุณ:
1. Rename Variable (เปลี่ยนชื่อตัวแปร)
การตั้งชื่อตัวแปรให้สื่อความหมาย เป็นสิ่งสำคัญอย่างยิ่งในการเขียนโค้ดที่ดี ชื่อตัวแปรที่ดี จะช่วยให้คนอื่น (รวมถึงตัวคุณเองในอนาคต) เข้าใจว่าตัวแปรนั้นใช้ทำอะไร
ปัญหา: ชื่อตัวแปรไม่สื่อความหมาย หรือใช้ตัวย่อที่ไม่ชัดเจน
วิธีแก้ไข: เปลี่ยนชื่อตัวแปรให้สื่อความหมายมากขึ้น
ตัวอย่าง:
// โค้ดก่อน Refactoring
$n = 10; // จำนวนสินค้า
// โค้ดหลัง Refactoring
$numberOfProducts = 10; // จำนวนสินค้า
ในตัวอย่างนี้ ตัวแปร $n ไม่ได้บอกอะไรเราเลยว่ามันคืออะไร การเปลี่ยนเป็น $numberOfProducts ทำให้ชัดเจนขึ้นทันทีว่าตัวแปรนี้ใช้เก็บจำนวนสินค้า
ข้อควรจำ: ชื่อตัวแปรที่ดี ควรบอกให้ได้ว่าตัวแปรนั้นใช้เก็บอะไร และมีข้อมูลประเภทไหน
2. Extract Method (แยกส่วนของโค้ดออกมาเป็น Method)
เมื่อฟังก์ชันหรือ Method ของคุณยาวเกินไป หรือมีหลายส่วนที่ทำงานแตกต่างกัน การแยกส่วนของโค้ดออกมาเป็น Method ย่อยๆ จะช่วยให้โค้ดของคุณอ่านง่ายขึ้น และง่ายต่อการนำกลับมาใช้ใหม่ (reuse)
ปัญหา: ฟังก์ชันยาวเกินไป ทำหลายอย่างพร้อมกัน
วิธีแก้ไข: แยกส่วนของโค้ดออกมาเป็น Method ย่อยๆ ที่ทำหน้าที่เฉพาะเจาะจง
ตัวอย่าง:
// โค้ดก่อน Refactoring
function processOrder($order) {
// ตรวจสอบข้อมูล Order
if (empty($order['items'])) {
throw new Exception("Order is empty");
}
// คำนวณราคารวม
$totalPrice = 0;
foreach ($order['items'] as $item) {
$totalPrice += $item['price'] * $item['quantity'];
}
// บันทึก Order ลง Database
// ... code สำหรับบันทึก Order ...
return $totalPrice;
}
// โค้ดหลัง Refactoring
function processOrder($order) {
validateOrder($order);
$totalPrice = calculateTotalPrice($order['items']);
saveOrderToDatabase($order);
return $totalPrice;
}
function validateOrder($order) {
if (empty($order['items'])) {
throw new Exception("Order is empty");
}
}
function calculateTotalPrice($items) {
$totalPrice = 0;
foreach ($items as $item) {
$totalPrice += $item['price'] * $item['quantity'];
}
return $totalPrice;
}
function saveOrderToDatabase($order) {
// ... code สำหรับบันทึก Order ...
}
ในตัวอย่างนี้ เราได้แยกฟังก์ชัน processOrder ออกเป็น 3 ฟังก์ชันย่อย คือ validateOrder, calculateTotalPrice และ saveOrderToDatabase แต่ละฟังก์ชันทำหน้าที่เฉพาะเจาะจง ทำให้โค้ดอ่านง่ายขึ้นและง่ายต่อการแก้ไข
ข้อควรจำ: พยายามแยกส่วนของโค้ดที่มีหน้าที่แตกต่างกัน ออกมาเป็น Method ย่อยๆ Method ที่ดี ควรทำหน้าที่เดียว และมีชื่อที่สื่อความหมาย
3. Inline Variable (แทนที่ตัวแปรด้วยค่าของมัน)
ในบางครั้ง การมีตัวแปรมากเกินไป อาจทำให้โค้ดอ่านยากขึ้น หากตัวแปรนั้นถูกใช้เพียงครั้งเดียว และค่าของมันไม่ได้ซับซ้อนมาก การแทนที่ตัวแปรด้วยค่าของมันโดยตรง อาจช่วยให้โค้ดกระชับและอ่านง่ายขึ้น
ปัญหา: ตัวแปรที่ถูกใช้เพียงครั้งเดียว ทำให้โค้ดดูรก
วิธีแก้ไข: แทนที่ตัวแปรด้วยค่าของมันโดยตรง
ตัวอย่าง:
// โค้ดก่อน Refactoring
function getDiscountedPrice($price, $discountPercentage) {
$discountAmount = $price * $discountPercentage;
$discountedPrice = $price - $discountAmount;
return $discountedPrice;
}
// โค้ดหลัง Refactoring
function getDiscountedPrice($price, $discountPercentage) {
return $price - ($price * $discountPercentage);
}
ในตัวอย่างนี้ เราได้แทนที่ตัวแปร $discountAmount และ $discountedPrice ด้วยค่าของมันโดยตรง ทำให้โค้ดสั้นลงและอ่านง่ายขึ้น
ข้อควรจำ: การ Inline Variable ควรทำเมื่อตัวแปรนั้นถูกใช้เพียงครั้งเดียว และค่าของมันไม่ได้ซับซ้อนมาก หากค่าของตัวแปรซับซ้อน หรือถูกใช้หลายครั้ง การ Inline Variable อาจทำให้โค้ดอ่านยากขึ้น
สรุป
Refactoring เป็นกระบวนการที่สำคัญในการพัฒนาซอฟต์แวร์ การ Refactoring ช่วยให้โค้ดของเราอ่านง่ายขึ้น เข้าใจง่ายขึ้น และง่ายต่อการแก้ไขและบำรุงรักษา ในบทนี้ เราได้เรียนรู้เทคนิค Refactoring ง่ายๆ 3 อย่าง คือ Rename Variable, Extract Method และ Inline Variable คุณสามารถนำเทคนิคเหล่านี้ไปใช้ได้ทันที เพื่อปรับปรุงโค้ดของคุณให้สะอาดตาและมีประสิทธิภาพมากยิ่งขึ้น
ในบทต่อไป เราจะมาเรียนรู้เกี่ยวกับ Clean Code ซึ่งเป็นหลักการและแนวทางในการเขียนโค้ดที่ดี เพื่อให้โค้ดของเราสะอาด อ่านง่าย และง่ายต่อการบำรุงรักษา