בחירת שמות למשתנים ופונקציות

[19 בדצמבר 2008] [1 תגובות]

האם כדאי להשקיע זמן בבחירת השמות שאנו מעניקים לפונקציות, למשתנים ולמחלקות?

אני מאמין שכן. תתפלאו לדעת כמה השפעה יש לבחירת שמות טובים ונכונים על הקוד שלכם. הוא יהיה קריא ומובן יותר, יקטין אי הבנות ויאפשר להרחיבו בעתיד.

למה לבחור שמות "טובים"?

המהדר מכריח אותנו לתת שם לכל משתנה, פונקצייה, אובייקט ומחלקה. לפעמים ממש מתחשק לנו להעניק את השם A לאובייקט שיצרנו מהמחלקה Apple. ממש גאוני! הרי כולם יבינו ש-A הוא מופע של תפוח, נכון? אז זהו, שממש לא. תראו איך בקלות אנו מבינים שהמחלקה Apple מייצגת תפוח גם בלי לראות את המימוש שלה ואילו A לא אומר דבר.

מה אנחנו רוצים שהשם יגיד לנו? הנה מספר דברים שחשבתי עליהם:

  1. סיווג המשתנה. האם הוא מספר, מחרוזת, אובייקט מסויים?
  2. מטרת המשתנה. האם הוא קיים על מנת לספור נקודות, לשמור את השם של המשתמש או להחזיק היסטוריה של פעולות?
  3. ה-Scope של המשתנה. האם הוא קיים רק בפונקצייה זו? האם הוא גלובאלי? האם הוא שדה של מחלקה?

קונבנציות

לפני שנראה איך כדאי לבחור שמות, כדאי להחליט על הקונבנציה שבה נשתמש. אין הבדל מעשי בין הקונבנציות, פשוט תבחרו את זאת שנראית לכם הכי נוחה לשימוש.

הראשונה היא שמות המופרדים בקו תחתי. בקונבנציה זו, כל האותיות של השם נכתבות באותיות קטנות (lowercase) והפרדה בין מילים נעשית על ידי קו תחתי. נהוגה אצל מתכנתי C\C++ תחת UNIX. דוגמאות:
worker
big_apple
my_id
is_a_member

השנייה היא הפרדה על ידי גודל האותיות. השמות מכילים אותיות קטנות וגדולות כאשר כל האותיות קטנות מלבד התחלות של מילים חדשות. נהוגה בעיקר אצל מתכנתים בסביבת Windows. מספר דוגמאות:
worker
bigApple
myId
isAMember

מומלץ לבחור קונבנציה ולדבוק בה. אחרת יהיה קשה יותר לבצע חיפושים אחר שמות, מכיוון שלא נדע איך להפריד בין המילים המרכיבות את שמות המשתנים.

טיפים לבחירת שמות

אם תשאלו אותי, הדבר החשוב ביותר הוא שהשם יתאר את המשתנה ולא יהיה צורך לבדוק איך הגדירו אותו בתוכנית. הנה מספר דוגמאות:

  1. נניח ויש לנו משתנה זמני מסוג מחרוזת המכיל את השם של המשתמש. זהו משתנה זמני מכיוון שבסיום הפונקציה כבר אין לנו צורך בו ולא נשתמש בו בעתיד. נרצה לבחור שם שיכיל את כל המידע הזה. שם טוב: tempUserName
  2. אנחנו צריכים לספור את שמות המועמדים לנשיאות ארה"ב - נעשה זאת על ידי מערך (הרי מספר המועמדים קבוע מראש). נוכל לקרוא למערך זה: candidateNames. שם פחות טוב הוא candidateName (ה-Name הוא ביחיד לעומת השם הקודם) מכיוון שנוכל לחשוב שמשתנה זה אינו מייצג מערך מכיוון שהוא מכיל שם אחד בלבד.  למעשה המשתנה יכול להכיל שמות רבים ולכן השם ברבים טוב יותר.
  3. יש לנו פונקצייה, המקבלת שתי מחרוזות ומחזירה ערך בוליאני. אם הן שוות היא מחזירה True ואחרת מחזירה False. אני אוהב להתחיל שמות של מתשנים בוליאנים ושל פונקציות המחזירות ערכים בוליאנים בתחילית is ("האם?"). לפונקציה כאן נוכל לקרוא: isEqualStrings
  4. למחלקה שאמורה להחזיק מידע על מכונית נוכל לקרוא carInfo. בחירה פחות טובה היא car, מכיוון שאז היינו עלולים לחשוב שהמכונית יכולה לבצע פעולות ולא רק מחזיקה מידע על מכונית.
  5. למחלקה carInfo יש מידע כגון צבע המכונית, היצרן ושנת הייצור. מכיוון שכל אלו שייכים למכונית עצמה, אני אוהב לתת את התחילית my ("שלי") לכל שדה של המחלקה. כאן נוכל לבחור: myColor, myManufactor ו-myManufactoringYear. כך נוכל לקבל נתונים מבחוץ עם השמות color ו-manufactor ונדע שאלו לא שייכים לנו (כלומר לאובייקט שבו אנחנו נמצאים).

מה רע ב-X ?

ישנם מקרים יוצאים מן הכלל, בהן דווקא שם שנראה חסר משמעות הוא הנכון. למעשה, ישנם שמות עם משמעות ידועה מראש.

כל מתכנת יודע שכאשר יש לו משתנה מסוג Integer הוא צריך לקרוא לו X, אם צריך עוד אחד אז Y. צריכים לולאה? הכי טוב לאתחל משתנה בשם I ואם יש צורך בלולאה פנימית אז J.

מכיוון שכל אחד יבין ש-I הוא מספר שלם שמטרתו לשמש כאינדקס של הלולאה ו-X הוא מספר שלם לצורך זמני, אלו הם שמות טובים.

איך יודעים אם שם הוא טוב?

אחרי שבחרתם שם למשתנה, כדאי לבדוק אם הוא טוב או לא. כלל אצבע לשם רע הוא "אם יש צורך להוסיף תיעוד ליד הגדרת השם, זהו שם רע!". שם טוב מעיד על המשתנה, אין צורך בתיעוד נוסף.

הנה עוד מספר שאלות שכדאי לשאול את עצמכם לאחר שבחרת שם:

  1. האם אני אבין בעתיד מהו סוג (מחרוזת, מספר שלם, מחלקה מסויימת) המשתנה רק מהשם שלו?
  2. האם אני אבין למה צריך את המשתנה הזה מהשם שלו בלבד?
  3. האם אני אבין אם המשתנה הזה שייך לאובייקט, הוא גלובאלי או שהוא בכלל זמני רק מקריאת השם שלו?
  4. האם המשתנים האחרים יצחקו עליו בבית הספר רק בגלל השם שנתתי לו?

אם אתם עדיין שלמים עם השם אחרי שעניתם לשאלות אלו, סימן שבחרתם בשם טוב.

אם אהבת את הפוסט, אני שולח מדי פעם למייל עוד פוסטים מעניינים שלא תמיד מגיעים להתפרסם באתר. אתה מוזמן להצטרף לרשימה:
(אני שונא ספאם. אני מבטיח לעולם לא לשלוח משהו לא מעניין)

1 תגובות

  1. איתי | 12/20/2008 1:20:36 AM

    שמות של משתנים תמיד בעלי חשיבות, וקרה לי כבר לעבור במערכת שלמה ולשנות את השם או אפילו כמה שמות של משתנים בגלל שלא תיארו לדעתי מספיק את מה שרציתי, ורק אחרי השינוי המשכתי לתכנת כרגיל.

     בנוגע לקומבינציה, אני מבדיל בין השימוש שלי בקומבינציות לפי שם הדף (גם להם אני מקדיש זמן, מה לעשות שב-PHP זה מקבל משמעות), ובדפים מסויימים אני מעדיף כך או אחרת, למרות שלדבוק בקומבינציה אחת בהחלט נשמע חכם.

התגובות נעולות