ונעבור לקצת ת'כלס.
בפרק זה נציג דוגמה של סט של סטנדרטים לקידוד. אלה אינם מחייבים אך הם דוגמא מומלצת לך - התוכניתן שמתחיל לפתח ורוצה להתרגל לעבוד באופן מסודר כפי שתידרש בכל בית תוכנה בו תעבוד.
ובכן, למה נעניק שמות במהלך הקידוד?
ובכן, בעצם לכל דבר שאיננו מילה שמורה בשפה:
שם לקובץ
קודם כל, כלל אצבע - שם קובץ והתכולה שלו נגזרים מהנושא שהוא מכיל ולא יותר מזה. אין שום דבר מזיק בהרבה קבצים המחולקים לפי קטגוריות - להיפך, זה מסדר לקורא הקוד את עולם התוכן והמושגים ועוזר לו למצוא את מה שהוא מחפש ביתר קלות.
-
הקובץ הראשי
ייקרא כמעט תמיד main עם הסיומת הרלוונטית לשפה. בכל שפה יש main שממנו מתחילה ריצת התוכנית ומשם מתפצל עץ הקריאות לשגרות. בתוכניות הקצרות שכתבתם עד כה בדרך כלל כל הקוד ישב בקובץ אחד, כולל ה-main. אם כן, לא אמור להיות בקובץ הראשי כמעט שום דבר חוץ מהקוד של ה-main. -
קובץ המכיל מחלקה
ייקרא באותו שם של המחלקה בהשמטת הקידומת C. -
קובץ של שגרות שירות ללא מחלקה (Utilities)
ייקרא על שם הנושא שבו עוסקות השגרות בשרשור המילה Utils כדי לציין שיש בקובץ שגרות שירות ולא מחלקה כלשהי. למשל, קובץ המכיל אוסף של שגרות שירות מתמטיות ייקרא MathUtils.xxx.
שים לב! רק במערכות תוכנה בינוניות ומעלה יש מקום לקבצי utilities. יש להיזהר מהפיכת קבצים אלה ל"מחסן" של כל מה שלא מצאנו מקום יותר טוב בשבילו עקב עיצוב לקוי. אם מצאת את עצמך שם בקובץ זה עוד ועוד שגרות כלליות "בינתיים", אז זה הזמן לבצע סקר עיצוב חוזר ולחלק מחדש את המחלקות והשגרות.
שם למתודה/שגרה
-
השגרה מוגדרת במקום אחד, אבל קוראים לה בהרבה מקומות. מה שרואים במקומות האלה, זה את השם שלה. לכן חובה ששם השגרה יתרום לקריאות התוכנית שקוראת לה.
לשם כך, השם של השגרה צריך להבהיר את פעולתה. -
שם השגרה צריך להיות קצר, קולע וברור.
-
השם של השגרה צריך להשתלב בקריאות לו ובפרמטרים שלו, ככה שהרצף של הקריאה שלהם תהיה הגיונית. זה לא אומר שהם חייבים ליצור משפט באנגלית, אבל שיצא הגיוני לתוכניתן שקורא.
-
מבחינה סטנדרטית החוקים לכתיבת שם שיגרה זהים לאלו של כתיבת שם משתנה, מלבד שאין איזכור לסוג המשתנה. למשל:
PerfromCalculation -
כדי להשתמש בשגרה יש לשלוח את הפרמטרים להם השגרה מצפה.כדי להשתמש בשגרה חשוב להבין את משמעות הפרמטרים שנשלחים אליה ואת השפעתם על פעולתה.
-
חשוב ששגרה תקבל מעט פרמטרים, שתהיה ברורה המשמעות שלהם (השם של השגרה יכול לעזור המון, ושמות הפרמטרים חייב לעזור עוד יותר), ושפעולת השגרה לא תושפע יותר מידי מהפרמטרים (צימוד נמוך).
-
דוגמא רעה
שגרה לטיפול בגיבוי שמקבלת פרמטר, שאם ערכו 1, היא מגבה, אם ערכו 2, היא משחזרת מהגיבוי. שים לב שהמשפט המתאר את השגרה חייב להיות די מסובך. זה צריך להדליק אור אדום. -
דוגמא טובה (אבל טריוויאלית)
פונקציה שמחברת שני מספרים, יכולה לקבל בפרמטרים הראשון והשני כל מני ערכים, אבל בכל מקרה, היא תחבר אותם. הפעולה לא משתנה -
דוגמא טובה (אבל מפתיעה)
פונקציה שמקבלת שני מספרים ואופרטור, ומפעילה את האופרטור על שני המספרים. האופרטור יכול להיות +, -, *, / או %, ולכל אחד תתבצע הפעולה המתאימה. טוב או רע? יש הרבה פעולות... אז זה רע... לא! לוגית, מדובר בפעולה אחת, שאפשר להסביר אותה לתוכניתן במשפט אחד: "ביצוע פעולה חשבונית על שני מספרים"
שם למשתנה
-
הגדרת המשתנים תבואנה בתחילת ה- Form/מודול/שגרה.
-
שמות משתנים הכוללים מושגים השייכים לתחום העיסוק המקצועי של המערכות לדוגמא – CustomerID או AchievedDistance. השמות לא ייכתבו ב"אינגלוז" (כתיבת המילה העברית באותיות אנגליות) אלא יתורגמו למילה המתאימה באנגלית. למשל:
int KamutSfarim;
int QuantityOfBook
-
שמות בוליאניים צריכים לשקף את ערך ה"אמת" שלהם בהקשר של עולם התוכן. דוגמא:
IsObjectInList
IsEmployeeinList
סוג |
דוגמא |
הסבר |
משתנה |
int nNoOfBaloons = 0 |
האות הראשונה הינה סוג המשתנה. |
משתנה |
|
למשתנים גלובאליים נוסיף התחילית |
קבועים |
#define _VEC_SIZE 100 |
קבועים יירשמו תמיד באותיות גדולות. מכיוון שקבועים מופיעים פחות ממשתנים בקוד, טבעי שהשמות שלהם יהיו ארוכים יותר ומפורטים יותר |
Enum |
enum DaysOfWeekEnum |
שם ה-enum יירשם עם אות גדולה |
Struct |
struct PersonDetStruct |
כאן יחולו אותם כללים כמו ל-Enum מלבד הסיומת שניתן לטיפוס: Struct |
טיפוס - Type |
typedef double RatioType; |
גם כאן יחולו אותם כללים כמו ל-Enum מלבד הסיומת שניתן לטיפוס: Type |
מחלקה |
Class CEmployee {...} |
מחלקה (Class) תיקרא בשם משמעותי , תתחיל באות גדולה ותוקדם ב-C לציון Class. למשל - CEmployee |
מערך |
[int arrnAges[SOL_NUM |
כאשר נגדיר מערך מסוג מסוים, האותיות הראשונות יהיו arr ולאחר מכן טיפוס הנתונים שמכיל המערך |
מחרוזת |
szMyName |
מבחינה לוגית לא מדובר כאן בוקטור של תוים כמו בדוגמא למעלה אלא במחרוזת. |
מצביע |
int* pnSumPointer |
מצביע למשתנה מסוג integer |
מופע של |
PersonDet prsnIdtMoshe DaysOfWeek dysofwkLastWeek |
כאשר נגדיר מופע של אוביקט שנוצר על ידנו, האותיות הראשונות (אלו שמצביעות על סוג המשתנה) יהיו האותיות של תחילת המילים של סוג האוביקט. |
Data Member |
int m_CustomerID; int* m_pCustomerID; |
את שם המשתנה יקדים m_ שיבהיר שמדובר ב-member |