למה לא להשתמש ב-GoTo
כל מתכנת צעיר שהולך ללמוד מהחכמים ממנו מגיע מתישהו לשלב בו אומרים לו שבשום פנים ואופן צריך להשתמש ב-GoTo, שפקודת ה-GoTo היא האויב הגדול של כל מתכנת, שאם תשתמש ב-GoTo כולם יצחקו עליך ואף אחד לא יקבל אותך לעבודה. בעוד שיכול מאוד להיות שההצהרות השלישית והרביעית נכונות, השנייה לא נכונה וזה תלוי איך אתה מסתכל על הראשונה.
אז למה לא להשתמש ב-GoTo?, מתכנת צעיר בטח שואל את עצמו. זה נכון ש-GoTo היא פתרון פשוט וקל לבעיות מעצבנות אבל היא לרוב תגרום לבעיות גדולות יותר בהמשך מסיבה אותה אפרט מיד.
מה הרי המתכנת רוצה מהתוכנה שלו? דבר ראשון שהוא צריך לרצות הוא שהיא תעבוד. אם היא לא עובדת מה שהיא שווה. הדבר השני והשלישי שהוא צריך לרצות, הסדר תלוי את מי שואלים, הם שהתוכנית שלו תהיה יעילה ואז אלגנטית ופשוטה. השאלה אם היא עובדת או לא לא קשורה לדיון הזה אבל צריך לשים לב לדרישות השנייה והשלישית. יכול להיות שהשימוש ב-GoTo תוביל לתוכנה יעילה אבל יכול להיות שלא. מה שכן בטוח הוא שהיא לא תהיה אלגנטית ופשוטה. ומה שמתכנת צעיר עוד לא כל כך מבין הוא שהתוכנה שהוא כותב לא תמיד תישאר מתחת לידיים שלו ולרוב הוא גם לא ירצה שהיא תישאר. ובמיוחד אם עובדים על פרויקט גדול בחברה רצינית עם עוד הרבה אנשים, התוכנה צריכה להיות קריאה מאוד וקלה להבנה, לפעמים מעבר להיותה יעילה ואופטימלית. והשימוש ב-GoTo דופק את העיקרון הזה.
שימוש ב-GoTo גורם לקפיצות במבנה הבקרה של התוכנה. ולא, זה בכלל לא אותו הדבר כמו מבנים חוזרים (לולאות, while, וכו’…) כי הם בנויים בבלוקים פשוטים שחוזרים על עצמם. גם רקורסיות שומרות על מבנה פשוט יחסית להכנסת פקודת GoTo. עם GoTo אפשר לקפוץ לכל נקודה בסכמת הריצה של התוכנית. אז אם תוכנית פשוטה ונחמדה היא סדרה של צמתים המחוברים על ידי קשתות מצומת לצומת, מקסימום לולאות עצמיות חוזרות, תוכנית עם GoTo מפרקת צמתים ושולחת קשת מכל מקום לכל מקום וכך מבלגנת לחלוטין את המבנה וגורמת למה שאני מכנה בחיבה, ‘סמטוכה’.
ומה שחשוב לזכור הוא שכתיבת התוכנה לראשונה הוא חלק קטן ממחזור החיים של התוכנה. לאחר מכן, כמו בכל דבר שכותבים, יש איטרציות ושיפוצים ותחזוקה והוספה והחסרה. אם אי אפשר להבין את המבנה של התוכנה, כל התהליך הזה הופך להיות מסובך מעריכית. וכל זה בלי להתחשב במשתמשים שאולי ירצו להוסיף מודולים בעצמם או ירצו לדעת קצת יותר על איך התוכנה עובדת כדי להשתמש בה יותר טוב.
לסיכום, אלו הסיבות, עשו לנו טובה ואל תשתמשו ב-GoTo. גם באסמבלי כדאי להימנע מזה כמה שאפשר.
Posted in Practice, Programming, Thinking Out Loud by Eran with 2 comments.
קישור מתבקש: http://xkcd.com/292/
לא חושב שהבנתי את ‘דנגו’…