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

סגור באמצעות טופס זה תוכלו לספר ולהמליץ לחבריכם..
שם השולח:
כתובת דוא"ל של השולח:
שם המקבל:
שלח לכתובת דוא"ל:
הוסף הערה:
מבוא לתכנות מונחה עצמים (OOP - Object Oriented Programming) - המחלקה (class)

תכנות מונחה עצמים (OOP) class 
 

 

מאת: ארז קלר

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

חלק 3 - המחלקה

המחלקה (Class)מחלקות (Classes) הן "אבני הבניין" הבסיסיות בשפות מונחות עצמים ,
מחלקה הנה ישות לוגית מופשטת המהווה בית יוצר לאובייקטים, 
ניתן לראותה כתבנית (Template) או כטיפוס ממנה נוצרים האובייקטים.
לדוגמה:
int num1, num2, num3;
המשתנים num1, num2, num3 נוצרים מהטיפוס int.
 
Person p1, p2, p3;
האובייקטים p1, p2, p3 נוצרים מהמחלקה Person
 
מחלקה מכילה שני מרכיבים מרכזיים : משתנים באמצעותם נתאר אובייקט מהמחלקה ופונקציות אשר מתארות את ההתנהגויות (פונקציונאליות) של האובייקט.
מבנה המחלקה מאפשר את ה- Encapsulation, באמצעותה אנו מקבלים את היכולת להשתמש באובייקטים מבלי לדעת כיצד הם מבצעים את הפעולות שאנו דורשים מהם (זוכרים את המכונית?, הטלוויזיה?), השימוש באובייקט מממש את התפיסה הנדרשת של "אני יודע מה, לא יודע איך" (ולרוב, גם לא מעניין אותנו).
 
המחלקה היא ישות לוגית מכיוון שהיא מכילה הגדרות בלבד, המחלקה מגדירה משתנים ומגדירה פונקציות, למעשה היא מגדירה את המסגרת בה מתקיים האובייקט, את תחום עיסוקו ואת תחום אחריותו.
 
המחלקה היא מופשטת מכיוון שהיא מתמקדת ומגדירה אך ורק את המשתנים המרכזיים ואת הפונקציות החשובות של האובייקט הנוצר מהמחלקה ומתעלמת מכל אלו אשר אינם חשובים,
במידה והיינו מעוניינים בתיאור מלא של מכונית היינו נדרשים להגדיר אלפי ועשרות אלפי תכונות....
המחלקה הנה "קופסא שחורה" המספקת למשתמשים בה התנהגויות אולם מסתירה מהם את המבנה הפנימי שלה.
המשמעות של "קופסא שחורה" היא שאין שום צורך להכיר ולהבין את המבנה הפנימי של המחלקה על מנת להשתמש בה, כמו שנהג אינו צריך להכיר את מבנה המנוע, ולהיכנס לפרטי הפרטים של מבנה מערכת התמסורת על מנת לנהוג ברכב.
ניתן לומר שמכונית חושפת התנהגויות (האצה, האטה, התנעה, הדלקת/כיבוי אורות וכו'), הנהג יכול לנצל את ההתנהגויות הללו על פי צרכיו, אולם אין הוא יודע ואין הוא צריך לדעת כיצד הן מתבצעות.
 
מחלקה, מכילה משתנים וגם פונקציות, האיור הבא מתאר מבנה של מחלקה טיפוסית:
class Person
משתני המחלקה מכונים גם מאפיינים או תכונות (Data Members או Attributes) ,
הפונקציות השייכות למחלקה מכונות מתודות או שיטות (Methods או Operations).
האיור מציג מבנה של מחלקה טיפוסית, במחלקה מוגדרות תכונות המתארות אובייקט מהמחלקה, התכונות מוגדרות כפרטיות באמצעות הסימן (–) משמאל לשם התכונה.
במחלקה מוגדרים גם מתודות (Methods) המתארות את הפעולות שניתן לעשות עם האובייקטים, המתודות מוגדרות כציבוריות באמצעות הסימן (+) משמאל לשם המתודה.
 
היכולת של מחלקה להגדיר גם את תיאור האובייקט וגם את הפונקציונאליות שלו היא חשובה ומרכזית בעולם ה- OOP ובעלת ערך מוסף גבוה.
יכולת זו מאפשרת להסתיר את המידע מהעולם החיצון (Data Hiding). 
המשמעות של הסתרת המידע (Data Hiding) מהעולם החיצון היא, שמחלקות אינן יכולות לגשת למידע השייך למחלקה אחרת, הגישה למשתני המחלקה נחסמת הן לצורך קריאה והן לצורך כתיבה, האלמנטים היחידים אשר יכולים לגשת למידע השייך לאובייקט הן המתודות של אותה המחלקה, והן בלבד.
לכל חבר מחלקה (Data Members או Methods) מוגדרת הרשאת גישה משלו, קיימות מספר הרשאות גישה, השכיחות ביותר הן: Public ו- Private.
 
Private: חברי מחלקה המוגדרים כ- Private הנם פרטיים למחלקה ולכן מוכרים רק על ידי המתודות של המחלקה, מחלקות אחרות אינן יכולות לגשת אליהם לא לצורך קריאת תוכנם ולא לצורך שינוי תוכנם, המחלקות השונות בפרויקט אף לא מודעות לקיומם של הרכיבים הפרטיים בתוך המחלקה.
 
Public:  חברי מחלקה המוגדרים כ- Public הנם ציבוריים ולכן הם מוכרים על ידי המחלקות האחרות בפרויקט אשר יכולות לגשת אליהם.
 
על מנת להגן על הנתונים נקפיד על הכלל הבא:
תכונות (Data Members) תמיד יוגדרו כ- Private.
רוב המתודות יוגדרו כציבוריות, אולם ,בעת הצורך, ניתן להגדירן גם כפרטיות.
 
הערך המוסף של כימוס (Encapsulation) בא לידי ביטוי הן באיתור ותיקון שגיאות לוגיות והן כאשר נוצר צורך לשנות את המבנה הפנימי של המחלקה.
 class diagram
 
 
 תוכנית מחשב בשפת #C מכילה אוסף אובייקטים וקשרים ביניהן (להם נקדיש פרק מיוחד בהמשך) ,האובייקטים מסתירים את התכונות (Data Members ) אולם חושפים פעולות (Methods) , אובייקט חיצוני המעוניין במידע מתוך מחלקה מסוימת חייב לקרוא למתודות של אותה המחלקה על מנת לקבל מהן מידע, אין לו גישה ישירה אליהן.
 
האיור הבא מדגים זאת:
 class diagram

כל ישות הפעילה בתוכנית מיוצגת באמצעות מחלקה, הישות יכולה להיות ישות מוחשית (מכונית, עובד, מחשב, ספר וכו'),
ישות יכולה להיות ישות מופשטת (תיאור פגישה, ציון, חוזה, תפקיד וכו'),
ישות יכולה לייצג אירוע (פגישה, טיסה, מסיבה, הלוואה, נסיעה, השאלה וכו')
 
מחלקה, כאמור הנה ישות לוגית או תבנית, בית היוצר לאובייקטים.
אובייקט הנו ישות פיזית, מופע (Instance) של מחלקה, ממחלקה אחת ניתן להגדיר הרבה מאוד אובייקטים, לדוגמה:
המחלקה Circle מגדירה את התכונות הבאות:
            צבע (Color) , גודל (Width, Height), מיקום (X,Y).
בתוכנית מחשב נוצרו האובייקטים הבאים ממחלקה זו:
הראשון צבעו ירוק, גודלו 100 ,Height=100Width= ומיקומו x=10, y=30.
השני צבעו כחול, גודלו 120 ,Height=120Width= ומיקומו x=20, y=150 ,
השלישי צבעו אדום, גודלו 70 ,Height=70Width= ומיקומו x=200, y=230 .
 
מהמחלקה Circle הוגדרו שלושה אובייקטים שונים (והיד עוד נטויה...)
  
גריידי בוך (Grady Booch), אחד המתודולוגים המובילים בעולם ה- OOP קבע את ההגדרה הבאה:
"לכל אובייקט יש מצב (State), התנהגות (Behavior) וזהות ייחודית (Identity)."
State – בכל מחלקה מוגדרות תכונות (Data Members) המתארות את האובייקט, ניתן גם לראותן כמבנה הנתונים של המחלקה.
כל אובייקט אשר נוצר ממחלקה מסוימת מכיל את אותו מבנה הנתונים. בכל זמן נתון יש לכל אחת מהתכונות הללו ערך (Value).
אוסף הערכים הללו (או חלקו) מייצג את ה- State של האובייקט, ה- State הוא דינאמי ויכול להשתנות על ציר הזמן.
ה- State מייצג מצב זמני בו נמצא האובייקט. ה-State  ישתנה כתוצאה בהפעלת מתודות.
לדוגמה : תכונה של מכונית המייצגת את מהירות המכונית מכילה את הערך 80 (Speed=80), ולכן המכונית נמצאת במצב "נסיעה", התכונה Speed מכילה את הערך 80 כתוצאה מהפעולות "סע" או "האץ" שהופעלו על האובייקט.  כתוצאה מפעולת "עצור" התכונה המייצגת את המהירות תתאפס (Speed=0) ולכן המכונית משנה את מצבה ל"עצירה".

יתכן ותכונות נוספות ישפיעו על המצב של האובייקט (סל"ד, הילוך וכו,) ויתכן ויהיו תכונות אשר לא ישפיעו על המצב הנוכחי בו נמצא האובייקט (כגון: צבע המכונית), אולם הן יכולות להשפיע על מצבים אופציונאליים אחרים של האובייקט.
 
Behavior - כל מחלקה מגדירה מתודות, כל מתודה מייצגת פעולה מוגדרת שהאובייקט יכול לבצע.
ההתנהגות של אובייקט מוגדרת כאוסף כל הפעילויות שהאובייקט יודע לבצע.
מכיוון שהמתודות מוגדרות במחלקה כל האובייקטים מאותה המחלקה מכילים התנהגות זהה.
ההתנהגות משפיעה על המצב (State) בו נמצא האובייקט.
 
Identity – לכל אובייקט יש מזהה ייחודי המבדיל בינו לבין שאר האובייקטים מאותה המחלקה.
הזיהוי הינו קבוע ואסור שהוא יושפע ממצב (State) המחלקה.
לדוגמה:
יתכן מצב ששתי מכוניות זהות (אותו היצרן,אותו הדגם, אותו המודל ואותו הצבע) נמצאות במצב זהה (נסיעה במהירות של 80 קמ"ש), ניתן יהיה להבחין ביניהן באמצעות מספר הרכב המציין את ה- Identity של כל מכונית.
כאשר המכוניות ישנו את מצבן לעצירה, מספר הרכב אינו משתנה.
במקרה של דוגמה זו לא ניתן להתייחס לאחת המכוניות על פי היצרן, הדגם או המודל או הצבע, לא ניתן להתייחס אליהן על פי המצב הזמני בו הן נמצאות, ניתן להתייחס לאחת מהן רק על פי מספר הרכב. 
באמצעות משתני המחלקה המייצגים את הזיהוי ניתן לבודד את האובייקט הרצוי ולהתייחס רק אליו.


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


תחביר:
  class syntax in c#
 
דוגמת קוד (ClassSample): 
 1  : public class Point 
 2  : { 
 3  :     private int m_X; 
 4  :     private int m_Y; 
 5  :     public Point() 
 6  :     { 
 7  :         this.m_X = 1; 
 8  :         this.m_Y = 1; 
 9  :     } 
 10 :     public Point(int x, int y) 
 11 :     { 
 12 :         this.m_X = x; 
 13 :         this.m_Y = y; 
 14 :     } 
 15 :     public void Move(int x, int y) 
 16 :     { 
 17 :         this.m_X = x; 
 18 :         this.m_Y = y; 
 19 :     } 
 20 :     public void Print() 
 21 :     { 
 22 :         Console.WriteLine("X = {0} , y = {1}", m_X, m_Y); 
 23 :     } 
 24 : } 
 קובץ: Person.cs
שורה 1: הגדרת מחלקה חדשה על ידי המילה השמורה class, שם המחלקה Person.
שורה 3,4: הגדרת תכונות למלחלקה החדשה.
שורה 5: בנאי (Ctor) ברירת מחדל (על בנאים יוסבר בהמשך).
שורה 10: בנאי.
שורה 15, 20: מתודות.


 1  : class Program 
 2  : { 
 3  :     static void Main(string[] args) 
 4  :     { 
 5  :         Point p1 = new Point(11, 22); 
 6  :         p1.Print(); 
 7  :         p1.Move(55, 66); 
 8  :         p1.Print(); 
 9  :  
 10 :     } 
 11 : } 
קובץ: Main.cs
שורה 5: הקצאת אובייקט והפעלת הבנאי (ועל כך נרחיב בהמשך)
שורות 5,6,7: הפעלת המתודות.

פלט:
 
 
 תרגיל הדוגמה מורכב משני קבצים:
  • Point.cs בו מוגדרת המחלקה Point.
  • Program.cs בו מוגדרת המחלקה Program המכילה את Main .
המחלקה Point מגדירה שתי תכונות המייצגות את מיקום הנקודה (על ציר ה-X ועל ציר ה- Y), ומספר מתודות המגדירות את ההתנהגויות (או הפעולות) של אובייקט מהמחלקה, המתודות מגדירות את  הפעולות שהאובייקט מהמחלקה מסוגל לבצע או שניתן לבצע עליו.

 



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