אב (11)

הרפתקאות נפלאות בקוד

 

יש בלוג שזה השם שלו. מגניב, לא?

 

ובאמת יש שם הרפתקאות נפלאות.

 

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

 

[אתם לא חייבים להצהיר בריש גלי שאתם נהנים לקרוא את המאמרונים באתר הזה (כי אז עלולים לחשוב שאתם חנונים, רח”ל), אבל אם תקראו בסתר – דעו שאתם לא לבד…]

 

 

במאמרון הזה המחבר שואל מה עדיף בין שני קטעי הקוד הבאים:

 

 

using Blah;
namespace Foo {
// etc
}

 

או

 

namespace Foo {
using Blah;
// etc
}

 

אז נכון, קשה לענות על השאלה “מה עדיף”, מפני שלא ידוע מה מטרת הקוד. אז המחבר מנסה לחשוב “מה ההבדל”.

 

התשובה הראשונית שלו היתה שאם יש רק namespace אחד בקובץ, אז זה לא כל כך משנה. אם יש שני namespace-ים בקובץ, אז שמים את ה-directive-ים המשותפים בחוץ, ואת אלה שלא רוצים לשתף – בפנים. הוא גם המשיך וציין כי קיומם של שני namespace-ים באותה רמה באותו קובץ הוא דבר משונה שיש להימנע ממנו.

 

מסתבר שתשובה זו אינה נכונה. יש הבדל בין שני קטעי הקוד שהמחבר לא חשב עליה מיד. הגרסה הראשונה היא שוות ערך ל-

 

 

using global::Blah;
namespace Foo {
// etc
}

 

והגרסה השניה היא שוות ערך ל-

 

namespace Foo {
using global::Blah;
// etc
}

 

אלא אם כן Foo מכילה Namespace בשם Blah. ואז הגרסה השניה היא בעצם שוות ערך ל-

 

namespace Foo {
using global::Foo.Blah;
// etc
}

 

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

 

 

 

 

כתבו תגובה

כתובת הדוא"ל שלכם לא תוצג.