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 בשנות ה-80 והופך לפופולרי ביותר על ידי ספרו של מרטין פאולר “Refactoring: Improving the Design of Existing Code” מ-1999. היום, רפקטורינג הוא חלק בלתי נפרד מפיתוח תוכנה מודרני, משולב בשיטות פיתוח שונות כמו Agile ו-TDD (Test-Driven Development).
כשאנחנו מדברים על אלטרנטיבות לרפקטורינג, אנחנו נכנסים לתחום של כתיבה מחדש או עיצוב מחדש. רפקטורינג הוא אסטרטגי והדרגתי, בעוד שכתיבה מחדש עשויה להיפטר מהקוד הקיים לטובת פתרון חדש. עיצוב מחדש, מאידך, עשוי לכלול שינויים משמעותיים יותר כולל שינויי פונקציונליות, שאינם מטרה לצורך רפקטורינג טהור.
פרטי היישום של רפקטורינג יכולים להיות די מפורטים. ישנם רבים ‘ריחות קוד’ שעשויים להצביע על צורך ברפקטורינג, כמו מתודות ארוכות, כיתות גדולות, או קוד משוכפל. קיימים כלים אוטומטיים שיכולים לסייע ברפקטורינג, כמו “קלנג-טיידי” עבור C++, שיכול לזהות בעיות ואף להחיל תיקונים.
בנוסף, רפקטורינג דורש מערכת מבדקים מוצקה כדי להבטיח שהפונקציונליות נשארת ללא שינוי. בלי מבדקים, אתם בעצם טסים בעיוורון ומסכנים את עצמכם לרגרסיות.
ראו גם
להבנה עמוקה יותר של רפקטורינג ולראות דוגמאות נוספות, תרצו אולי לבדוק:
- הטקסט הקלאסי של מרטין פאולר “Refactoring: Improving the Design of Existing Code” לרעיונות ואסטרטגיות בסיסיים.
- את התיעוד של
Clang-Tidy
בכתובת https://clang.llvm.org/extra/clang-tidy/ לתמיכה אוטומטית ברפקטורינג ב-C++. - “Working Effectively with Legacy Code” מאת מייקל פתרס, שמספק טכניקות לרפקטורינג בטוח בהקשר של בסיסי קוד פחות מושלמים.