תכנות מונחה עצמים (OOP) - מחלקות ומערכים

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

מחלקות ומערכים
 
מאת: ארז קלר

הורדת דוגמאות קוד

הטיפול באובייקט יחיד שונה מטיפול באוסף אובייקטים.
 
מחלקות ומערכים

ההתנהגות הנדרשת מאובייקט מהמחלקה Person יכול להיות: הגדרת ערכים לתכונות, בדיקה האם חל יום ההולדת, שליחת אימייל וכו'.
תוכנת ספר טלפונים מטפלת באוסף של אובייקטים מהמחלקה Person.
ההתנהגות הנדרשת מאוסף אובייקטים מהמחלקה Person תהיה שונה: הוסף אובייקט, מחק אובייקט, חפש אובייקט, מיין את רשימת האובייקטים וכו'.
 
תכנון ועיצוב נכון של מערכות מבוססות OOP מפריד בין המחלקה המטפלת ביחיד לבין המחלקה המטפלת באוסף האובייקטים הקיים במערכת.
לדוגמה:
בתוכנית "ספר טלפונים" נגדיר מחלקה בשם Person אשר תטפל בכל ההיבטים הקשורים באובייקט יחיד ומחלקה נוספת בשם PersonArray אשר תטפל בכל ההיבטים של אוסף האובייקטים מטיפוס Person הקיים בספר הטלפונים.

נגדיר לכל אחת מהמחלקות את המתודות הנדרשות:
במחלקה Person נגדיר את המתודות המטפלות בהתנהגויות של הגדרת ערכים לתכונות, בדיקה האם חל יום ההולדת, שליחת אימייל, עדכון ערכים.
למחלקה PersonArray נגדיר את המתודות המטפלות בהתנהגויות של  הוספת אובייקט, מחיקת אובייקט, חיפוש אובייקט, הדפסת  שמות האנשים וכו' .
 
שלב מקדים למימוש מחלקת אוסף הוא להבין כיצד מגדירים מערך של אובייקטים (כתחליף למערך ניתן להשתמש ב-<List<T).
 
מערך של אובייקטים

אובייקטים הם מטיפוס ערך (Reference Types) ולכן בניית מערך של אובייקטים כרוכה בהוספת שלב נוסף לשלבים המוכרים לנו מהגדרת והקצאת מערך של Value Types .
בניית מערך של אובייקטים מתבצעת בשלושה שלבים:
1 - הגדרת ייחוס למערך.
2 - הקצאת המערך- יוצרת את המערך עצמו המכיל ייחוסים לאובייקטים בלבד.
3 - הקצאת האובייקטים והעברת כתובתם (הייחוס) שלהם למערך.

דוגמת קוד: ObjectsArray

המחלקה Person:

 1  : using System; 
 2  : using System.Collections.Generic; 
 3  : using System.Linq; 
 4  : using System.Text; 
 5  : using System.Threading.Tasks; 
 6  :  
 7  : namespace ObjectsArray 
 8  : { 
 9  :     class Person 
 10 :     { 
 11 :         private int m_ID; 
 12 :         private string m_LastName; 
 13 :         private string m_FirstName; 
 14 :         private DateTime m_Birthdate; 
 15 :         private string m_PhoneNumber; 
 16 :         private string m_WebSiteAddress; 
 17 :         private string m_EmailAddress; 
 18 :         public Person(int id) 
 19 :         { 
 20 :             this.m_ID = id; 
 21 :         } 
 22 :         public int ID 
 23 :         { 
 24 :             get { return m_ID; } 
 25 :             set { m_ID = value; } 
 26 :         } 
 27 :         public string LastName 
 28 :         { 
 29 :             get { return m_LastName; } 
 30 :             set { m_LastName = value; } 
 31 :         } 
 32 :         public string FirstName 
 33 :         { 
 34 :             get { return m_FirstName; } 
 35 :             set { m_FirstName = value; } 
 36 :         } 
 37 :         public DateTime Birthdate 
 38 :         { 
 39 :             get { return m_Birthdate; } 
 40 :             set { m_Birthdate = value; } 
 41 :         } 
 42 :         public string PhoneNumber 
 43 :         { 
 44 :             get { return m_PhoneNumber; } 
 45 :             set { m_PhoneNumber = value; } 
 46 :         } 
 47 :         public string WebSiteAddress 
 48 :         { 
 49 :             get { return m_WebSiteAddress; } 
 50 :             set { m_WebSiteAddress = value; } 
 51 :         } 
 52 :         public string EmailAddress 
 53 :         { 
 54 :             get { return m_EmailAddress; } 
 55 :             set { m_EmailAddress = value; } 
 56 :         } 
 57 :         public void Print() 
 58 :         { 
 59 :             Console.WriteLine("***************************"); 
 60 :             Console.WriteLine("ID:{0},Last Name:{1},First Name:{2}", m_ID, m_LastName, m_FirstName); 
 61 :             if (m_PhoneNumber != null) 
 62 :                 Console.WriteLine("Phone : {0}", m_PhoneNumber); 
 63 :             if (m_WebSiteAddress != null) 
 64 :                 Console.WriteLine("Web Site:{0}", m_WebSiteAddress); 
 65 :             if (m_EmailAddress != null) 
 66 :                 Console.WriteLine("Email : {0}", m_EmailAddress); 
 67 :         } 
 68 :     } 
 69 : } 

Main:
 1  : class Program 
 2  : { 
 3  :     static void Main(string[] args) 
 4  :     { 
 5  :         Person[] arr = new Person[5]; 
 6  :         Person p = new Person(1); 
 7  :         p.LastName = "Gashmiel"; 
 8  :         p.FirstName = "Hasya"; 
 9  :         p.PhoneNumber = "03-1234567"; 
 10 :         p.WebSiteAddress = "http://www.gashmiel.co.il"; 
 11 :         p.EmailAddress = "hasya@gashmiel.co.il"; 
 12 :         arr[0] = p; 
 13 :  
 14 :         p = new Person(2); 
 15 :         p.LastName = "Pendelovich"; 
 16 :         p.FirstName = "Bruria"; 
 17 :         p.PhoneNumber = "02-7654321"; 
 18 :         p.WebSiteAddress = "http://www.pendel-ltd.co.il"; 
 19 :         p.EmailAddress = "bruria@pendel-ltd.co.il"; 
 20 :         arr[1] = p; 
 21 :  
 22 :         p = new Person(3); 
 23 :         p.LastName = "Fakakte"; 
 24 :         p.FirstName = "Elimelech"; 
 25 :         p.PhoneNumber = "09-9797979"; 
 26 :         p.EmailAddress = "fakateeli@walla.co.il"; 
 27 :         arr[2] = p; 
 28 :  
 29 :         p = new Person(4); 
 30 :         p.LastName = "Mashpritza"; 
 31 :         p.FirstName = "Nitza"; 
 32 :         p.PhoneNumber = "08-1234321"; 
 33 :         p.WebSiteAddress = "http://www.MySite.com"; 
 34 :         p.EmailAddress = "nitza@google.com"; 
 35 :         arr[3] = p; 
 36 :  
 37 :         p = new Person(5); 
 38 :         p.LastName = "Farunkel"; 
 39 :         p.FirstName = "Roni"; 
 40 :         p.PhoneNumber = "050-4567654"; 
 41 :         p.WebSiteAddress = "http://www.roni.name"; 
 42 :         p.EmailAddress = "ronifar@yahoo.com"; 
 43 :         arr[4] = p; 
 44 :  
 45 :         foreach (Person per in arr) 
 46 :             per.Print(); 
 47 :     } 
 48 : } 
שורה 5 - הגדרת ייחוס למערך של אובייקטים.
בשלב זה קיים ייחוס למערך אבל עדיין מערך:
Person[] arr = new Person[5];

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


שלב שני, עדיין בשורה 5, הקצאת מערך של ייחוסים לאובייקטים
Person[] arr = new Person[5];
בשלב זה קיים יחוס למערך, אולם הוא ריק ואין בו אובייקטים.
מערך אובייקטים - שלב ב - הקצאת מערך של אובייקטים
כל אחד מהאיברים 0-4 הוא ייחוס לאובייקט, אולם בשלב זה הוא אינו מיוחס לשום אובייקט, את זה נבצע בשלב הבא.

בשורות 6, 14, 22, 27, 39 נקצה את האובייקטים, ונעביר אותם למערך, p הוא ייחוס לאובייקט מהטיפוס Person ואותו נעביר למערך (לאחר הקצאתו), איברי המערך מיוחסים לאובייקט שממוקם אי שם במרחבי הזיכרון.
תמונת הזכרון לאחר שלב זה:
מערך של אובייקטים - שלב שלישי - הקצאת האובייטים והעברתם למערך

פלט:
ObjectsArray - פלט תוכנית הדוגמה

מחלקת מערך
תכנון ועיצוב נכון של מערכות מבוססות OOP מחייב הפרדה בין טיפול במחלקת יחיד לבין טיפול באוסף אובייקטים, ההפרדה חייבת להיות הפרדה מבנית, דהיינו, הגדרת מחלקות שונות לטיפול ביחיד וברבים.
בספר הטלפונים שלנו נגדיר שתי מחלקות:
הראשונה Person תטפל בכל ההיבטים של ישות בודדת  בספר הטלפונים, השנייה PersonArray אשר תטפל בכל ההיבטים של ניהול אוסף ישויות.
תרגיל הדוגמה ObjectsArray02 מדגים זאת (בתרגיל נעזר במחלקה Person זהה למחלקה שהוצגה בתרגיל הדוגמה הקודם):
 
המחלקה PersonArr:

 1  : class PersonArr 
 2  : { 
 3  :     private Person[] arr; 
 4  :     private int counter; 
 5  :     public PersonArr() 
 6  :     { 
 7  :         arr = new Person[10]; 
 8  :     } 
 9  :     public PersonArr(int size) 
 10 :     { 
 11 :         if (size  > 0) 
 12 :             arr = new Person[size]; 
 13 :         else 
 14 :             Console.WriteLine("Error,...greater then zero"); 
 15 :     } 
 16 :     public void Add(Person p) 
 17 :     { 
 18 :         if (p != null) 
 19 :             Console.WriteLine("Error, param can't be null"); 
 20 :         if (arr.Length < = counter) 
 21 :         { 
 22 :             Array.Resize(ref arr, arr.Length + 10); 
 23 :         } 
 24 :         arr[counter++] = p; 
 25 :     } 
 26 :     public Person Find(int id) 
 27 :     { 
 28 :         for (int i = 0; i <  counter; i++) 
 29 :         { 
 30 :             if (arr[i].ID == id) 
 31 :                 return arr[i]; 
 32 :         } 
 33 :         return null; 
 34 :     } 
 35 :     public void Print() 
 36 :     { 
 37 :         for (int i = 0; i <  counter; i++) 
 38 :             arr[i].Print(); 
 39 :     } 
 40 :     public void Remove(int id) 
 41 :     { 
 42 :         for (int i = 0; i <  counter; i++) 
 43 :         { 
 44 :             if (arr[i].ID == id) 
 45 :             { 
 46 :                 arr[i] = null; 
 47 :                 for (int j = i; j <  counter; j++) 
 48 :                     arr[j] = arr[j + 1]; 
 49 :                 counter--; 
 50 :                 return; 
 51 :             } 
 52 :         } 
 53 :     } 
 54 : } 
שורה 1: המחלקה PersonArr מנהלת אוסף אובייקטים מהמחלקה Person.
שורה 3: אחסון מערך האובייקטים כתכונה של המחלקה.
שורה 4: מספר האובייקטים במוצבים במערך.

שורה 5: בנאי ברירת המחדל, מקצה מערך בגודל 10 איברים.
שורה 9: בנאי שמקבל כפרמטר את גודל המערך הנדרש ומקצה אותו.
שורה 16: מתודה שמוסיפה אובייקטים מהמחלקה Person למערך.
שורה 26: מתודה במוצאת אובייקט על פי ערך ה-ID שלו.
שורה 35: מתודה שמדפיסה את איברי המערך.
שורה 40: מתודה שמוחקת איבר מהמערך על פי ערך ה-ID של Person.

למעשה המחלקה PersonArr מספקת מעטפת מלאה לטיפול באוסף אובייקטים מהמחלקה PersonArr.


Main:
 1  : class Program 
 2  : { 
 3  :     static void Main(string[] args) 
 4  :     { 
 5  :         PersonArr arr = new PersonArr(); 
 6  :         Person p = new Person(1); 
 7  :         p.LastName = "Gashmiel"; 
 8  :         p.FirstName = "Hasya"; 
 9  :         p.PhoneNumber = "03-1234567"; 
 10 :         p.WebSiteAddress = "http://www.gashmiel.co.il"; 
 11 :         p.EmailAddress = "hasya@gashmiel.co.il"; 
 12 :         arr.Add(p); 
 13 :  
 14 :         p = new Person(2); 
 15 :         p.LastName = "Pendelovich"; 
 16 :         p.FirstName = "Bruria"; 
 17 :         p.PhoneNumber = "02-7654321"; 
 18 :         p.WebSiteAddress = "http://www.pendel-ltd.co.il"; 
 19 :         p.EmailAddress = "bruria@pendel-ltd.co.il"; 
 20 :         arr.Add(p); 
 21 :  
 22 :         p = new Person(3); 
 23 :         p.LastName = "Fakakte"; 
 24 :         p.FirstName = "Elimelech"; 
 25 :         p.PhoneNumber = "09-9797979"; 
 26 :         p.EmailAddress = "fakateeli@walla.co.il"; 
 27 :         arr.Add(p); 
 28 :  
 29 :         p = new Person(4); 
 30 :         p.LastName = "Mashpritza"; 
 31 :         p.FirstName = "Nitza"; 
 32 :         p.PhoneNumber = "08-1234321"; 
 33 :         p.WebSiteAddress = "http://www.MySite.com"; 
 34 :         p.EmailAddress = "nitza@google.com"; 
 35 :         arr.Add(p); 
 36 :  
 37 :         p = new Person(5); 
 38 :         p.LastName = "Farunkel"; 
 39 :         p.FirstName = "Roni"; 
 40 :         p.PhoneNumber = "050-4567654"; 
 41 :         p.WebSiteAddress = "http://www.roni.name"; 
 42 :         p.EmailAddress = "ronifar@yahoo.com"; 
 43 :         arr.Add(p); 
 44 :  
 45 :         arr.Print(); 
 46 :  
 47 :         arr.Remove(3); 
 48 :         arr.Print(); 
 49 :  
 50 :     } 
 51 : } 



 



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