Bash:
רפקטורינג
איך לעשות:
בואו נשקול סקריפט Bash פשוט שדורש ריפקטורינג. הוא מועקם, עם קוד חוזר על עצמו וקשה לעקוב אחריו:
#!/bin/bash
echo "הזן שם קובץ:"
read filename
if [ -f "$filename" ]; then
echo "הקובץ קיים."
count=$(grep -c "foo" "$filename")
echo "המילה foo מופיעה $count פעמים."
else
echo "הקובץ לא קיים."
fi
לשם הבהרה ושימוש חוזר ייתכן ותהיה התערבות של הצגת פונקציות וטיפול יותר חסדי בשגיאות:
#!/bin/bash
function file_exists() {
[[ -f "$1" ]]
}
function count_occurrences() {
grep -c "$1" "$2"
}
function main() {
local filename word count
echo "הזן שם קובץ:"
read -r filename
echo "הזן את המילה לחיפוש:"
read -r word
if file_exists "$filename"; then
count=$(count_occurrences "$word" "$filename")
echo "המילה $word מופיעה $count פעמים."
else
echo "הקובץ לא קיים." >&2
exit 1
fi
}
main "$@"
הגרסה שעברה ריפקטורינג משתמשת בפונקציות כדי לשפר את קריאות הקוד ומאפשרת שימוש חוזר אפשרי.
חקירה עמוקה:
ריפקטורינג אינו מושג שהתחיל עם Bash או אפילו עם שפות תכנות רמה-גבוהה; הוא מושג עתיק כתכנות עצמו. המונח קיבל פורמליזציה בספר “Refactoring: Improving the Design of Existing Code” מאת מרטין פאולר ב-1999, שמתמקד בעיקר בשפות מונחות עצם.
בהקשר של כתיבת סקריפטים ב-Bash, ריפקטורינג לעיתים פירושו פיצול סקריפטים ארוכים לפונקציות, הפחתת חזרתיות באמצעות לולאות או תנאים, ומניעת שגיאות נפוצות כמו אי טיפול ברווחים בשמות קבצים. חלופות ל-Bash עבור סקריפטים שהפכו מורכבים מכדי לכלול Python או Perl, אשר מציעים מבני נתונים טובים יותר וטיפול בשגיאות עבור משימות מורכבות.
ריפקטורינג ספציפי ל-Bash מתמקד יותר בהיצמדות למעשים הטובים ביותר, כמו הציטוט של משתנים, השימוש ב-[[ ]]
לבדיקות במקום [ ]
, והעדפת printf
על פני echo
לפלט נחוש. פרטי היישום לעיתים נעים סביב הצמדה למדריכי סגנון והשימוש בכלים כמו shellcheck
לניתוח סטטי כדי לתפוס שגיאות נפוצות.