קצת הבהרה על המושג namespace
-
קראתי קצת על המושג הזה (מרחבי שמות בלע"ז) ואני קצת מבולבל :? אשמח אם מישהו יעשה לי קצת סדר בראש..
קודם כל, כדי להגדיר אותו צריך קובץ חדש בשם namespace ותחתיו לפרט את כל המחלקות ששייכות אליו? אם כן, האם צריך רק להזכיר את שמם או גם לכתוב את כל התוכן של המחלקה??
או שיותר נראה לי שבעצם בכל קובץ שאני מגדיר מחלקה, אני מראש מציין לאיזה namespace היא שייכת, ואז אני לא צריך את כל הבלאגן הזה.. (כי בכל הדוגמאות של המדריכים זה נראה שכותבים קובץ מיוחד כדי להגדיר בתוכו את כל המחלקות ששייכות לאותו מרחב שמות..)בפשטות הבנתי שהצורך בזה הוא כדי שאני אוכל להשתמש בכל מיני מחלקות שכבר כתבו עבורי (כגון כל מחלקות הSystem למיניהם..) וכדי לכלול אותם בתוכנית אני צריך להשתמש בusing ולציין את המרחב שמות שלהם ובא לציון גואל.. אבל לפי מה שאני קורא זה בא לענות על צורך נוסף כדי שנוכל להשתמש בכמה מחלקות עם שם זה כמו point שנכתבו ע"י אנשים שונים, וכיון שהמהדר לא יכול לדעת למי לפנות, אז צריך לתת לו כתובת מדוייקת ולכלול כל אחד מהם במרחב שמות אחר.. (וכאן אם הבנתי נכון עדיף להשתמש בalias=כינוי כדי לכתוב קוד קצר ובהיר..).
הבנתי נכון??ובהמשך: מדוע יש צורך להשתמש בReference? האם בגלל שאלו מחלקות שאני (או כל אחד אחר :lol: ) כתבתי בפרוייקט אחר, ואם לא אצרף את הקבצים שלהם בפועל לתכנית אז המהדר לא יכיר אותם, בניגוד לכל המחלקות המובנות של דוטנט שקיימות אצלו ורק צריך להזכיר אותם? או שיש סיבות אחרות..
לילה טוב!! ותודה מראש לעונים ולמבהירים.
פורסם במקור בפורום CODE613 ב01/06/2015 00:25 (+03:00)
-
איי איי איי. לאט לאט עם שפע הבלבול.
בC#, כצורה לסדר מחלקות בחרו בדרך של מרחבי שמות. איך זה עובד?
אז קודם המשוגים האחרים שלא יתערבבו:
assmbly - פרוייקטים, Reference. לא קשור בשום צומת לNamespace
נניח אני חברה ואני כותב שפע מחלקות לטיפול בוידאו. הם נמצאים בכמה וכמה פרוייקטים - קרי: אסמבליים (יחידות קוד שבד"כ הם קבצי DLL). הקשר בין הפרוייקטים, כלומר אם פרוייקט ב' (נקרא לו: נצרך) צריך להשתמש בקוד מפרוייקט א' (נקרא לו: מספק), זה תלות אסמבליים: אסמבלי א' צריך את אסמבלי ב'. אז היכולת להשתמש באסמבלי אחד בקוד שכתוב באסמבלי אחר מבוצע ע"י Reference. הReference הוא פעולה שהDLL/פרוייקט הנצרך, מבצע בשביל לטעון את הDLL/פרוייקט המספק (פעולה זו היא חד צדדית, וא"א לבצעה גם לכיוון ההפוך).אחרי שבוצע Reference אז כל הקוד באסמבלי המספק (שמוגדר ברמה גישה מעל internal), זמין בפרוייקט כאילו נכתב באותו הפרוייקט. זה יוצר קצת בעיה. כי אם בפרוייקט יש מחלקה שקוראים לה ConvertToBinary בהקשר מקומי, אז תהיה התנגשות שמות כשנבצע Reference לפרוייקט שמכיל מחלקה בשם דומה. בעיה, לא?
בשביל זה יש namespace.איך מגדירים
namespace לא מגדירים בשום מקום מעבר למקום בו משתמשים בו, כלומר עוטפים בו קוד. namespace הוא גלובלי, ומה שייכתב בnamespace זה ה"הקדמה" הנחוצה לשימוש במחלקה (בתוך הNamespae עצמו פטורים מה"הקדמה"). אז אם יש לנו בפרוייקט א' מחלקה בשם ConvertToBinary ונעטוף אותה בNamespace ככה:namespace ProjectA { public class ConvertToBinary { .... } }
אז בכל מקום אחר הפניה למחלקה תתבצע ע"י ProjectA.ConvertToBinary.
זה גם מונע התנגשויות וגם מסדר את הקוד. כי אם מפתח רואה את המחלקה ConvertToBinary עם namespace מתאים אז הוא מבין באיזה תחום המחלקה מטפלת וכדומה.
איך השם מורכב
אפשר לבחור באיזה namespace שרוצים, ואפשר לכלול בשם הnamespace נקודות. וזה הופך את ההרגשה כלפיהם להיררכיה: System.Collections.Generic. ברמת המחשב זה פשוט שם ארוך שהרשו לכלול בו נקודות, אך למפתח זה נותן הסבר ברור על מטרתה של המחלקה והרקע למקרה בו היא נדרשת.
איזה שם בוחרים
אין כזה דבר namespace תפוס, ניתן להשתמש באותו namespace בפרויקטים שונים, ואף בחברות שונות (לכן אין מניעה שאתה תעטוף את המחלקה שלך בnamespace בשם System). רק שאז, אין מה שימנע מקרה ההתנגשות. בפרט אם ייתכן שבפרויקט אחד שתי המחלקות יבואו לשימוש. לכן מקובל תמיד שהרכיב הראשון בnamespace הוא שם החברה (גם מקרוסופט נוהגים ככה, רק שהמחלקות הפנימיות ב.net נחשבות לגלובליות ולא "שלהם"), ואח"כ התחום ובמקרה הצורך תת תחום וכו'.using - נטו קוסמטי, וברמת קובץ
ללא המושג using, היינו צריכים לכתוב כל מחלקה בשמה המלא - עם ההקדמה של הnamespace. זה מאוד מייגע ולא קריא לפעמים.
הusing בעצם אומר, במהלך הדף הנוכחי (קובץ), אני פטור מלכתוב את הקידומת XXX למחלקות ששוכנות שם.
אם לולי הusing היינו כותביםSystem.Console.WriteLine("");
אז אחרי שמוסיפים למעלה using System; די בכך:
Console.WriteLine("");
(אגב, את הConsole עדיין חייבים לכתוב, כי זה לא חלק מהnmaespace אלא שם המחלקה ממש שהWriteLine היא מתודה סטטית בתוכה. בC# 6 אפשר לייבא כמו namespace גם מחלקות סטטיות ואז אפשר לכתוב ישירות את שם המתודה בלבד. אבל 10 שנים חיו בלי זה מצויין :)).
naemspace וintellisense - השלמה אוטומטית
intellisense זה השם שמקרוסופט נתנו לכלי ההשלמה האוטומטית ברחבי הVisual Studio. הוא מנצל את עובדת סידור הקוד בnamespace לסינון ההצגה לפני המשתמש. במקום להציג כל מה ששייך, מוצג רק מה שזמין לרמה הנוכחית. כשמקישים נקודה אחרי שם namespace חלקי מקבלים את האפשרויות ההמשך ו/או מחלקות שנמצאים תחת השם הזה.לסיכום, חלוקת הקוד בC# על פני מחלקות, קבצים, אסמבליים ומרחבי שמות.
מחלקות
מחלקה תמיד נמצאת באסמבלי אחד ותחת namespace אחד. אך יכולה להתפרס על פני כמה קבצים ע"י partial.
קבצים:
יכולים להכיל 10 מחלקות (וכאמור מחלקה יכולה להתפרס על פני כמה קבצים), וגם כמה namespace בבלוקים נפרדים.
כל קובץ נכנס כולו לאסמבלי אחד בלבד.
using זה דרך קידוד שפעולת ברמת קובץ בודד וחוסכת הקלדה מלאה של הnamespac.
אסמבלי:
יכול להכיל הרבה קבצים, מחלקות, namespace. צריך להשתמש בReference כדי לפנות לאסמבלי אחר, אפי' שזה אותו שם של namespace.
namespace:
יכול "להתפרס" איך שרוצים. פעמיים באותו הקובץ ובאוו הפרויקט ובפרויקטים שונים (זה לא נכון באמת, כי namespace זה סה"כ שם ושימוש חוזר בו פשוט נותן את האפקט ה"חזותי" של partial).בשולי הדברים, namespace ברמת הביצוע הוא פשוט תוספת לשם של כל מחלקה. מבחינת המהדר אין כזה מושג namespace!
פורסם במקור בפורום CODE613 ב01/06/2015 12:55 (+03:00)