C++:
การปรับโครงสร้างโค้ด
วิธีการ:
ลองนึกภาพว่าคุณมีฟังก์ชันที่ทำงานมากเกินไป เช่น เมธอดตุ้มๆ นี้ที่เริ่มต้นวัตถุและทำการบันทึกด้วย:
#include <iostream>
class Widget {
public:
void init(bool verbose) {
// โลจิกการเริ่มต้น
// ...
// การบันทึกแบบละเอียด
if (verbose) {
std::cout << "Widget initialized!" << std::endl;
}
}
};
// การใช้งาน:
Widget w;
w.init(true);
ผลลัพธ์:
Widget initialized!
การปรับโครงสร้างใหม่ให้เป็นเมธอดที่เน้นและชัดเจนมากขึ้นอาจมีลักษณะดังนี้:
#include <iostream>
class Widget {
public:
void init() {
// โลจิกการเริ่มต้นเท่านั้น
// ...
}
void logInitialization() const {
std::cout << "Widget initialized!" << std::endl;
}
};
// การใช้งาน:
Widget w;
w.init();
w.logInitialization();
การเปลี่ยนแปลงนี้ไม่ได้เปลี่ยนสิ่งที่โปรแกรมทำแต่ทำให้คลาส Widget
มีโมดูลาร์มากขึ้นและการใช้งานชัดเจนมากขึ้น
ศึกษาเพิ่มเติม
แนวคิดของการปรับโครงสร้างใหม่เช่นที่เราเข้าใจในปัจจุบันมีรากฐานมาจากชุมชนการเขียนโปรแกรม Smalltalk ในทศวรรษที่ 1980 และได้รับการนิยมอย่างมากจากหนังสือของ Martin Fowler เรื่อง “Refactoring: Improving the Design of Existing Code” ตั้งแต่ปี 1999 ในปัจจุบัน การปรับโครงสร้างใหม่เป็นส่วนหนึ่งของการพัฒนาซอฟต์แวร์สมัยใหม่ รวมเข้ากับวิธีการพัฒนาต่างๆ เช่น Agile และ TDD (Test-Driven Development)
เมื่อเราพูดถึงทางเลือกสำหรับการปรับโครงสร้างใหม่ เราจะเข้าสู่เขตแดนของการเขียนใหม่หรือการออกแบบใหม่ การปรับโครงสร้างใหม่เป็นการทำอย่างก้าวกระโดดและค่อยเป็นค่อยไป ในขณะที่การเขียนใหม่อาจละทิ้งโค้ดที่มีอยู่เพื่อแก้ไขด้วยโซลูชันใหม่ การออกแบบใหม่ในขณะเดียวกันอาจต้องการการเปลี่ยนแปลงที่สำคัญยิ่งขึ้นรวมถึงการเปลี่ยนแปลงฟังก์ชั่น ซึ่งไม่ใช่เป้าหมายหลักสำหรับการปรับโครงสร้างใหม่โดยบริสุทธิ์
รายละเอียดการดำเนินการปรับโครงสร้างใหม่สามารถลงรายละเอียดได้มาก มี ‘กลิ่นโค้ด’ มากมายที่อาจนำไปสู่การปรับโครงสร้างใหม่ เช่น เมธอดยาว คลาสใหญ่ หรือโค้ดซ้ำ มีเครื่องมืออัตโนมัติที่สามารถช่วยในการปรับโครงสร้างใหม่ เช่น “Clang-Tidy” สำหรับ C++ ซึ่งสามารถตรวจจับปัญหาและแม้กระทั่งปรับใช้การแก้ไขบางอย่างได้
นอกจากนี้ การปรับโครงสร้างใหม่ต้องการชุดทดสอบที่มั่นคงเพื่อให้มั่นใจว่าฟังก์ชั่นยังคงไม่เปลี่ยนแปลง โดยไม่มีการทดสอบคุณก็เหมือนบินตาบอดและเสี่ยงต่อการถอยหลัง
อ้างอิง
สำหรับการเข้าใจการปรับโครงสร้างใหม่อย่างลึกซึ้งและดูตัวอย่างเพิ่มเติม คุณอาจต้องการดู:
- ข้อความคลาสสิกของ Martin Fowler เรื่อง “Refactoring: Improving the Design of Existing Code” สำหรับแนวคิดพื้นฐานและกลยุทธ์
- เอกสาร
Clang-Tidy
ที่ https://clang.llvm.org/extra/clang-tidy/ สำหรับการสนับสนุนการปรับโครงสร้างใหม่อัตโนมัติใน C++ - “Working Effectively with Legacy Code” โดย Michael Feathers, ซึ่งมีเทคนิคสำหรับการปรับโครงสร้างใหม่อย่างปลอดภัยในบริบทของฐานโค้ดที่ไม่สมบูรณ์แบบ