תכנות מתקדם ב-Java/אובייקטים: הבדלים בין גרסאות בדף

תוכן שנמחק תוכן שנוסף
Johnny Zoo (שיחה | תרומות)
אין תקציר עריכה
Johnny Zoo (שיחה | תרומות)
אין תקציר עריכה
שורה 1:
'''אובייקטים''' או '''עצמים''', הם אבני היסוד של התכנות מונחה העצמים.
 
===הקדמה - תכנות מונחה עצמים===
[[w:he:תכנות מונחה עצמים|תכנות מונחה עצמים]] - תפיסה בתחום התכנות, לפיה התוכנה מורכבת מאוסף של עצמים שונים. כל עצם הוא בעל תכונות ואפיונים משלו, ומכלול העצמים יוצר את התוכנה המוגמרת. תכנות מונחה עצמים מסייע לבניית קוד מודולרי, פשוט לשינוי, קל לשליטה (באופן יחסי) גם בתוכניות גדולות, ורב שימושי - קטע קוד אחד יכול להשתלב בתוכניות רבות.
 
====דוגמה - מכולת====
ניקח דוגמה פשוטה: נניח שאנו רוצים לבנות תוכנה לניהול מלאי של חנות מכולת. הדרישות הן פשוטות: אפשר ליצור סוגי מוצרים חדשים, ולשנות את המחיר של מוצרים חדשים. אפשר להוסיף ולהחסיר מהמלאי, ואפשר גם לחשב את ערך כל המוצרים במלאי ולהדפיס רשימת מלאי. כיצד נממש זאת בעזרת אובייקטים?
נשתמש בשני סוגי אובייקטים:
שורה 12:
קל לראות שקיימים קשרים בין האובייקטים: בעת הדפסת רשימת מלאי, למשל, פונה אובייקט המלאי לפונקציית ההדפסה של כל מוצר במלאי. בעת חישוב סך ערך המלאי ישתמש אובייקט המלאי, כחלק מהחישוב, בנתוני המחיר והכמות שמכיל כל מוצר.
 
===מבנה===
כל טיפוס של אובייקט נקרא "מחלקה" (Class). מחלקה מכילה בנאים (והורסים), מתודות/שיטות (Methods) ומשתנים פנימיים. בדוגמה שלנו, קיימות שתי מחלקות: מלאי, ומוצר. המלאי מכיל את השיטות "חשב ערך כולל", "הדפס מלאי", "הוסף מוצר למלאי", וכן הלאה. הוא מכיל את הנתונים לגבי המוצרים: מערך מטיפוס "מוצר". המוצר יכיל כמה שיטות משלו: "הדפס מוצר", "צור מוצר חדש", וכדומה. הוא יכיל משתנים פנימיים: משתנה שיכיל בתוכו את מחיר המוצר, משתנה שיכיל את שם המוצר, וכן הלאה.
 
====בנאים====
בנאי (Constructor), כשמו, הוא כלי באמצעותו יוצרים אובייקט. לכל אובייקט קיים בנאי, ולפעמים גם כמה סוגים של בנאים. חוץ מיצירת האובייקט, הבנאי יכול להכיל פעולות כאוות נפשו של המתכנת. הערה: בניגוד לשפות (כמו C++), בהן קיים צורך להשמיד (Destruct) כל אובייקט לאחר השימוש בו כדי לפנות את הזיכרון בו נעשה שימוש, בג'אווה אין צורך בכך - כלי בשם Garbage Collector (אוסף האשפה) אחראי על פינוי הזיכרון, ומסיר בכך את הנטל מעל כתפי המתכנתים. נעיר כי העדפה זו של הנוחות עולה במחיר מה של מהירות הריצה.
 
====משתנים פנימיים====
משתנים פנימיים הם המשתנים אותם מכיל האובייקט בתוכו. הם יכולים להיות מכל סוג שהוא - משתנים פשוטים כמו int או String, מערכים, או אף אובייקטים אחרים.
 
====שיטות====
החלק העיקרי ברוב האובייקטים הוא השיטות אותן הוא כולל בתוכו. מחוץ לפרמטרים הרגילים, השיטות (למעט הסטטיות) נקראות ומתבצעות על האובייקט עצמו.
 
===איך זה נראה בג'אווה===
בג'אווה, כל קובץ הוא מחלקה. שם הקובץ חייב להיות כשם המחלקה הנמצאת בו, לכם יש מתאם בין שם הקובץ לשם המחלקה. כל מחלקה כזאת מכילה את המרכיבים שנזכרו לעיל. כל מחלקה מכילה בנאי. במחלקה בה לא כתב המתכנת בנאי - מוסיף המהדר, בצורה אוטומטית, בנאי ריק, שלא מקבל פרמטרים כלשהם. פרט לכך, מחלקה יכולה להיות ריקה: אין הכרח שיהיו בה משתנים פנימיים או שיטות. אפשר לדלג על ההסברים ולעיין בדוגמה, אך לשם הבנה נכונה יותר - כדאי לחזור אליהם לאחר מכן.
 
====בנאי====
הבנאי הוא שיטה ששמה כשם המחלקה, ושאינה מחזירה ערך משום סוג. אם נניח ששם המחלקה הוא MyClass, הבנאי יראה כך:
<div style="text-align:left; direction:ltr;"><pre>
שורה 46:
מרבית הקוראים בוודאי יתמהו: מדוע להכריז בצורה כזו על האובייקט? מדוע שלא להכריז על אובייקט כמו שמכריזים על משתנה פשוט - {{קוד בשורה|MyClass obj;}}?
למען האמת, מורכבת ההכרזה שהצגנו כאן משני חלקים. החלק הראשון, הימני - {{קוד בשורה|MyClass obj}} מקצה מקום בזיכרון עבור אובייקט מטיפוס MyClass. המחשב מקצה את המקום הדרוש, אך לא יוצר בו אובייקט. החלק השני, השמאלי, בו אנו פונים לבנאי, הוא החלק שיוצר את האובייקט, במקום שכבר הוקצה עבורו בזיכרון. כשתלמדו כמה צדדים מתוחכמים יותר של התכנות מונחה העצמים תוכלו להבין טוב יותר מדוע קיימת ההפרדה הזו.
 
===משתנים ושיטות===
צורת העבודה עם המשתנים והשיטות דומה מאוד לזו שכבר הכרנו, אך ללא המילה {{קוד בשורה|static}}. בעבודה עם אובייקטים נהוג להשתמש במשתנים גלובליים - של האובייקט.
 
===פנייה למשתנים ושיטות===
נקודת ההסתכלות צריכה לעבור מהפך, כאשר מתעסקים בתכנות מונחה עצמים. כעת, כל פעולה שמתבצעת - מתבצעת על אובייקט. כדי לבצע פעולה כלשהי על אובייקט, משתמשים בצורה
{{קוד|obj.action(arguments)}}
כדי לבצע את השיטה action (עם הארגומנטים arguments) על האובייקט obj, או
{{קוד|obj.variable}}
כדי לפנות למשתנה variable, שהוא משתנה פנימי של האובייקט obj.
 
שיטות בתוך האובייקט עצמו, כלומר - שיטות בתוך המחלקה - יכולות לפנות ישירות למשתני המחלקה (אך לא למשתנים סטטיים). שיטות מתוך האובייקט יכולות לפנות ישירות גם לשיטות (לא סטטיות) אחרות של המחלקה. גם הפניות האלה נעשות אל אובייקט - אל אותו האובייקט עצמו.
 
===תוכנית המכולת===
נראה כאן מימוש בג'אווה של ה"מכולת" אותה תיארנו קודם. נעבוד עם שני קבצים: {{קוד בשורה|Item.java}} יכיל את המחלקה המטפלת במוצרים. {{קוד בשורה|Stock.java}} יכיל את המחלקה המטפלת במלאי.