כולנו עושים refactoring לקוד שכתבנו (מקווה), חלקנו מבצעים code review.
יש כמה סימנים לזיהוי מקומות ״מסריחים" שאנחנו צריכים לטפל בהם (code smell) ולהלן העיקריים שבהם:
יש כמה סימנים לזיהוי מקומות ״מסריחים" שאנחנו צריכים לטפל בהם (code smell) ולהלן העיקריים שבהם:
- הערות-צריכות לתאר ״למה״ ולא ״מה״. ה״מה״ צריך להיות מובן משמות המשתנים והפונקציות.
- פונקציות ארוכות - פונקציות קצרות יותר קל להבין, לקרוא, לתקן במידת הצורך. פונקציה אחראית על פעולה לוגית אחת (תפקיד אחד). קצרו את הפונקציות בהתאם.
- מספר רב של פרמטרים - ככל שלפונקציה יש מספר רב של פרמטרים, כך היא הופכת למסובכת יותר. תגבילו את מספר הפרמטרים, או השתמשו באובייקט שמרכיב כמה פרמטרים.
- שכפול קוד - אל תחזרו על עצמכם. שכפול קוד הוא אחד הטעויות הכי גדולות..
- תנאים מורכבים - המנעו מקינונים ארוכים ככל האפשר. במיוחד כאשר יש אפשרות שהקינונים יגדלו עם הזמן. במידת הצורך השתמשו בתבניות העיצוב: decorator, strategy, state.
- שימוש בswitch - תקראו את הפוסט שלי "אני לא יודע מה זה switch״
- העברת בוליאני כמשתנה לפונקציה - מצביע שלפונקציה יותר מתפקיד אחד.
- מחלקות ארוכות - כמו פונקציות ארוכות, מחלקות ארוכות קשות לקריאה, הבנה, ותחזוקה. אם המחלקה ארוכה תבדקו אם היא מכילה יותר מדי תפקידים ואחריות. אם כן תפצלו את המחלקה למספר מחלקות קצרות.
- השם של הפונקציה מורכבת מה type - עדיף שהשם של הפונקציה לא יהיה מורכב מה type שהיא מחזירה. זה מכריח אותנו לשנות את שם הפונקציה אם נשנה את ה type שהיא מחזירה
- שמות משמעותיים לפונקציות - האם השם מתאר את מה שהפונקציה עושה? האם מישהו שלא מכיר מה הפונקציה עושה, יכול להבין מה היא עושה רק על פי השם?
- שמות קונסיסטנטים - תצמדו לסטנדרט מסויים בכתיבת שמות משתנים ופונקציות
- שימוש ב ref ו out - אם אתם צריכים שהפונקציה תחזיר יותר ממשתנה אחד השתמשו ב class members . אם אין קשר בין המשתנים החוזרים, אז הפונקציה מבצעת יותר מתפקיד אחד.
- קוד ללא שימוש - מוחקים קוד שאין בו שימוש. זו הסיבה שיש source control.
- להימנע מתכנון של משהו שאף פעם לא יקרה - תכתבו קוד שאמור לפתור את הבעיה של היום. ברוב המוחלט של המקרים, אין צורך בגנריות כאשר לא צריך.. זה מסבך את הקוד, ופחות קריא (אלא אם באמת יש דרישה לגנריות)
- פרמטרים ללא שימוש - המנעו מלכתוב אובייקטים עם פרמטרים שאף אחד לא משתמש בהם.
- מימוש interface זהה - אם יש שני מחלקות שזהות במרכיבים הפנימיים שלהם, אז שיממשו אותו interface
- מחלקות נתונים - המנעו מכתיבת מחלקות שמכילות רק נתונים. מחלקות צריכות להכיל גם פונקציות שעובדות על הנתונים.
- הורשה לא רצויה - אם אתם יורשים ממחלקה כלשהי, אבל אין שום שימוש בפונקציונליות שההורשה מספקת אז כנראה שלא מתאימה פה הורשה.
- המעיטו בחשיפת מטודות - המחלקות צריכות להיות כמה שפחות חשופות. צריכה להיות סיבה ממש טובה אם יש מטודה שהיא public.
- מטודות שמשתמשות במחלקות אחרות - אם המטודה שכתבתם משתמשת באופן רציף בפונקציונליות של מחלקה אחרת, כנראה שמקומה במחלקה שהיא משתמשת בה, ולא מקומה הנוכחי.
- מחלקות בשימוש מועט - כל מחלקה נוספת בפרויקט גורמת לקוד שלנו להיות יותר מורכב אם יש לנו מחלקה שלא עושה הרבה, אז בדקו אם אפשר לאחד אותה למחלקה אחרת
- Shotgun surgery - כל שינוי קטן בקוד שלכם גורם לבעיות בכמה מחלקות אחרות? כנראה שיש לכם בעיה. תנסו לתקן את הקוד.
- פנייה לכלי בצד שלישי - כשפונים לספק חיצוני (למשל oracle) תעטפו את הפנייה במחלקה דקה כלשהי, כי במידה ותשנו את הספק (למשל sql) אז נצטרך לתקן רק במקום אחד.
מבוסס על Smells to refactoring
תהנו!
תהנו!






