יחסים בין מחלקות

סגור באמצעות טופס זה תוכלו לספר ולהמליץ לחבריכם..
שם השולח:
כתובת דוא"ל של השולח:
שם המקבל:
שלח לכתובת דוא"ל:
הוסף הערה:
כתיבת מחלקת Model ומחלקת Mapping עבור הטבלה RssFeed

יחסים בין מחלקות
מאת: ארז קלר
 
הקשרים בין הטבלאות צריכים לבוא לידי ביטוי גם במחלקות המודל.
במחלקות המודל הם מתורגמים ליחסי הכלה בין אובייקטים.
הקשרים בין הטבלאות צריכים לבוא לידי ביטוי גם במחלקות המיפוי, שם הבעיה מורכבת קצת יותר.
נתחיל בהתאמת מחלקות המודל ל-OOP ונעבור להתמודד עם מחלקות המיפוי.
התאמת מחלקות המודל
בין הטבלאות Website ו- RssFeed מתקיימים יחסי יחיד-רבים:
לכל אתר יש הרבה קבצי RSS, קובץ RSS  משויך לאתר אחד בלבד.
יחסים בין המחלקות Website ו-RssFeed
במחלקות המודל, יחסים אלו עדיין לא באים לידי ביטוי:
 1  : public class RssFeed 
 2  : { 
 3  :     public int RssFeedID { get; set; } 
 4  :     public string Title { get; set; } 
 5  :     public string Link { get; set; } 
 6  :     public string Descriprion { get; set; } 
 7  :     public int WebsiteID { get; set; } 
 8  :     public int CategoryID { get; set; } 
 9  : } 
 1  : public class Website 
 2  : { 
 3  :     public int WebsiteID { get; set; } 
 4  :     public string Name { get; set; } 
 5  :     public string LogoLink { get; set; } 
 6  :     public string Link { get; set; } 
 7  : } 

השדה WebsiteID של הטבלה Website הוא המפתח הראשי (Primary Key) והוא מוגדר כמפתח משני (Secondary Key) בטבלה RssFeed.
במחלקה Website הקשרים הללו לא באים לידי ביטוי, במחלקה RssFeed הם באים לידי ביטוי בצורה שמתאימה למסד נתונים אולם לא על פי עקרונות OOP.
על פי עקרונות ה- OOP המחלקה Website צריכה להכיל אוסף של אובייקטים מטיפוס RssFeed (מממשת את הרבים) והמחלקה RssFeed צריכה להכיל אובייקט בודד מטיפוס Website (מממשת את היחיד).
תחילה נוסיף אוסף אובייקטים (מימוש הרבים) מהמחלקה RssFeed למחלקה Website: 

 1  : public class Website 
 2  : { 
 3  :     public int WebsiteID { get; set; } 
 4  :     public string Name { get; set; } 
 5  :     public string LogoLink { get; set; } 
 6  :     public string Link { get; set; } 
 7  :     public RssFeeds RssFeeds { get; set; } 
 8  : } 

לאחר מכן נמחק את המאפיין WebsiteID מהמחלקה RssFeed ובמקומו נציב אובייקט (מימוש היחיד) ממחלקה זו:
 1  : public class RssFeed 
 2  : { 
 3  :     public int RssFeedID { get; set; } 
 4  :     public string Title { get; set; } 
 5  :     public string Link { get; set; } 
 6  :     public string Description { get; set; } 
 7  :     public int WebsiteID { get; set; } 
 8  :     public Website Website { get; set; } 
 9  :     public int? CategoryID { get; set; } 
 10 : } 
התאמת מחלקות המיפוי
רשומת Website במסד הנתונים תהיה קשורה למספר רשומות RssFeed.
איך זה בא לידי ביטוי במודל?
זאת שאלת "המיליון דולר".
האם בכל פעם שנקרא ממסד הנתונים רשומת Website נקרא גם את כל הרשומות RssFeed הקשורות בה? או רק מתי שצריך ומה שצריך?
לקריאה מוקדמת של רשומות הבנים יש יתרון, נצמצם בדרך זו את כמות הפניות למסד הנתונים ונשפר בכך את ביצועי המערכת.
יש לזה חיסרון, כמות הזיכרון שהתוכנית תצרוך תהיה גדולה מאוד.
ובכלל מתי עוצרים?
אם נקרא את רשומות הבנים אז מה עם רשומות הבנים שלהם? ורשומות הבנים שלהם ...... האם נקרא את כל מסד הנתונים?
כנראה שלא.   
אם בכל פעם שנציג את רשימת האתרים נציג גם את רשימת קבצי ה- RSS שלהם אז אולי יש היגיון בלקרוא גם את הרשומות הקשורות.
נתאים את מחלקות המודל למצב בו הקריאה לרשומות בנים לא תהיה אוטומטית, אלא לפי הצורך.
נתחיל במחלקה RssFeedDB, נוסיף למחלקה שתי מתודות, הראשונה SelectParentWebsite מקבלת אובייקט מודל מהטיפוס RssFeed ומחזירה את ה-Parent, דהיינו, אובייקט מהטיפוס Website המקושר אליה במסד הנתונים.
המתודה השנייה, SelectByWebSite, מקבלת אובייקט Website ומחזירה את רשימת ה-RssFeed  המקושרים אליו.

 1  : public class RssFeedDB 
 2  : { 
 3  :     . . . 
 4  :     public Website SelectParentWebsite(RssFeed feed) 
 5  :     { 
 6  :         WebsiteDB website_db = new WebsiteDB(); 
 7  :         return website_db.SelectByID(feed.WebsiteID); 
 8  :     } 
 9  :     public RssFeeds SelectByWebSite(Website website) 
 10 :     { 
 11 :         command.CommandText = string.Format("SELECT * FROM RssFeed WHERE WebsiteID = {0}", website.WebsiteID); 
 12 :         RssFeeds RssFeeds = Select(); 
 13 :         if (RssFeeds.Count() > 0) 
 14 :             return RssFeeds; 
 15 :         return null; 
 16 :     } 
 17 :     . . . 
 18 : } 

 WebsiteDB
 1  : public class WebsiteDB 
 2  : { 
 3  :      . . . 
 4  :     public RssFeeds SelectRssFeedsChilds(Website website) 
 5  :     { 
 6  :         RssFeedDB rss_feed_db = new RssFeedDB(); 
 7  :         RssFeeds feeds = rss_feed_db.SelectByWebSite(website); 
 8  :         for (int i = 0; i < feeds.Count(); i++) 
 9  :         { 
 10 :             feeds[i].Website = website; 
 11 :         } 
 12 :         return feeds; 
 13 :     } 
 14 :      . . . 
 15 : } 
המתודה בונה את יחסי ההכלה הדו כיווניים בין האובייקטים.
דוגמת קוד:

 1  : WebsiteDB db = new WebsiteDB(); 
 2  : Website website = db.SelectByID(1); 
 3  : website.RssFeeds = db.SelectRssFeedsChilds(website); 
 

 



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



כל הזכויות שמורות למחבר ©