שפת C, פקודות goto, ניהול משאבים ומה שביניהם.

ב־12.10.2008, מאת ארתיום; פורסם תחת: פיתוח, תכנה ומחשבים; ‏5 תגובות

לאחרונה, התפתח דיון מעניין ב־WhatsUp שהפתח מהצגה של דוגמת הקוד הקטנה, שמשתמשת ב־goto. אחת הסיבות ל"רעש" מסביב לקוד הזה, היא העובדה מפקודות goto נחשבת למסוכנת ומזיקה. אבל, כידוע, בעולם שלנו לא הכל שחור לבן.

בשפות ללא destructorים כמו Java זה מאוד מקובל להשתמש בקטעי־try/finally לניהול משאבים. לדוגמה:

void function()
{
    resource r1,r2;
    try {
        r1.allocate()
        if(error1) throw;
        r2.allocate()
        if(error2) throw;
        do_something;
        if(error3) throw;
    }
    finally {
        r1.free();
        r2.free();
    }
}

למעשה, throw מקפיץ אותך לקטע finally שמאפשר שחרור מסודר של משאבים שלא מנוהלים ב־gc. עכשיו בואו נסתכל בקוד הבא:

void function()
{
    resource r1,r2;
    {
        r1.allocate()
        if(error1) goto filally;
        r2.allocate()
        if(error2) goto filally;
        do_something;
        if(error3) goto filally;
    }
    finally: {
        r1.free();
        r2.free();
    }
}

אתם מזהים את הדמיון המפתיע? כן, זאת השיטה המקובלת, המסודרת והנכונה לנהל משאבים ב־C. לאתחל את כל המשאבים בצורה מרוכזת, לשחרר אותם בצורה מרוכזת ובכל מקרה של שגיאה לקפוץ לקטע שדואג לטפל בהם.

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

תגובות

sijp, ב־12.10.2008, 12:45

האמת, הרבה יותר מפחיד אותי שפשוט דינוזאור יבוא ויטרוף אותי מאשר שהקוד שלי יהיה לא מסודר: http://xkcd.com/292

צפריר כהן, ב־12.10.2008, 15:50

למעשה, גם switch הוא סוג של goto .

תנסו להבין בדיוק למה השינוי הקטן הזה לא משנה בכלל פונקציונליות:

(וכן. מדובר על קוד C מחריד)

צפריר כהן, ב־12.10.2008, 15:53

משהו שם לא הסתדר עם ה־markdown . אז לכו ל: http://repo.or.cz/w/asterisk-bristuff.git?a=commit;h=1b8a7f713e6eac7c66a8f66625d387ff67a29b8b ולחצו על diff

ארתיום, ב־12.10.2008, 16:14

למעשה, גם switch הוא סוג של goto .

תנסו להבין בדיוק למה השינוי הקטן הזה לא משנה בכלל פונקציונליות:

תשמע, זו מצווה שבקוד כמו שראית יהיו באגים כאלה... מי שכותב ככה, מגיע לו.

נ.ב. תיקנתי את הקישור, הבעיה הייתה ב־URL שמשום מה הכיל ; במקום &.

elcuco, ב־12.10.2008, 19:45

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

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

המחשב שלי נקי מאסטריסק... לפחות הוא מוגן.

הוסף תגובה:

 
 כתובת דוא"ל לא תוצג
 

ניתן לכתוב תגובות עם שימוש בתחביר Markdown.

חובה לאפשר JavaScript כדי להגיב.

דפים

נושאים