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

אין תקציר עריכה
אין תקציר עריכה
אין תקציר עריכה
{{תכנות מתקדם ב-Java}}
{{בעבודה}}
'''אובייקטים''' או '''עצמים''', הם אבני היסוד של התכנות מונחה העצמים.
 
 
===תוכנית המכולת===
נראה כאן מימוש (עדיין לא מספק) בג'אווה של ה"מכולת" אותה תיארנו קודם. נעבוד עם שלושה קבצים: {{קוד בשורה|Item.java}} יכיל את המחלקה המטפלת במוצרים. {{קוד בשורה|Stock.java}} יכיל את המחלקה המטפלת במלאי. הקובץ השלישי אינו חלק מהמימוש עצמו, אך הוא יראה כיצד מחלקה אחרת ניגשת אל המחלקות שיצרנו ועושה בהן שימוש.
<source lang = "java">
// Item.java
// Item's price
private double _price;
// Quantity of that item
private int _quantity;
// Days left for that item until expired
private int _daysLeft;
/*
* Constructor
*/
public Item(String name, String desc, double price, int quantity, int days) {
_name = name;
_description = desc;
_price = price;
_quantity = quantity;
_daysLeft = days;
}
// Set days left until expiration
public void SetDaysLeft(int newDaysLeft) {
_daysLeft = newDaysLeft;
}
// Set item's quantity
public void setQuantity(int newQuantity) {
_quantity = newQuantity;
}
public double getPrice() {
return _price;
}
// Get item's quantity
public int getQuantity() {
return _quantity;
}
System.out.println("Item: "+_name);
System.out.println("Description: "+_description);
System.out.println("Price: "+_price+" Quantity in stock: "+_quantity+);
" Days until expiration: "+_daysLeft);
}
}
 
}
</source>
זהו המימוש של מוצר במכולת. המחלקה מכילה את כל השדות (המשתנים הפנימיים) והשיטותוכמה הדרושותשיטות לנו (כפי שפורטו למעלה)נחוצות. לשםהמוצר הפשטותמכיל תאריךרק התפוגהנתונים נקבעשנוגעים באמצעותישירות מספראליו, שלםאך שסופרלא אתנתונים הימיםכמו עדכמות התפוגה.המוצר נראהבמלאי, כאןכיוון אתשזה קודעניין המחלקה האחראית על ניהולשל המלאי:<!-- המימוש הזה גרוע ולא שימושי,של אבלהמוצר הואעצמו. מתאיםנראה לצורךכעת ההסבר.את נאהמחלקה לאהאחראית לשנותעל -->המלאי:
<source lang = "java">
// Stock.java
public class Stock {
// Array that holds all itemsItems in the stock
private Item _item1;
private Item _item2;
// Quantity of thateach product item
private int _quantity_item1Q;
private int _daysLeft_item2Q;
// Set days leftDays until expiration for each product
private int _exp1;
private int _exp2;
/*
// Add item to stock
public void addItem(Item it, int quantity, int expiration) {
if(_item1 == null) {
_item1 = it;
_quantity _item1Q = quantity;
else if(_item2 == null)
_exp1 = expiration;
}
else if(_item2 == null) {
_item2 = it;
_item2Q = quantity;
_exp2 = expiration;
}
else
System.out.println("Stock is full, cannot add "+it.getName());
// Print all items in stock
public void printStock() {
if(_item1 != null) _item1.printItem();{
if(_item2 != null) _item2 _item1.printItem();
System.out.println("NoQuantity: such"+_item1Q+" itemExpiration: "+itemName_exp1);
}
if(_item2 != null) {
_item2.printItem();
System.out.println("Quantity: "+_item2Q+" Expiration: "+_exp2);
}
}
double sum = 0.0;
if(_item1 != null)
sum+=_item1.getPrice()*_item1.getQuantity()_exp1;
if(_item2 != null)
sum+=_item2.getPrice()*_item2.getQuantity()_exp2;
return sum;
}
// Set new quantity for that item
public void setItemQuantity(String itemName, int newQuantity) {
if(_item1.getName().equals(itemName))
_item1.setQuantity(newQuantity);
else if(_item2.getName().equals(itemName))
_item2.setQuantity(newQuantity);
else {
System.out.println("No such item: "+itemName);
}
}
}
stck.printStock();
// Add items to stock:
Item it1 = new Item("Cheese","Smelly green cheese", 1.5, 2, 7);
Item it2 = new Item("Tomato","Fresh tomamto", 2.6, 25, 10);
stck.addItem(it1, 2, 7);
stck.addItem(it2, 3, 5);
stck.printStock();
System.out.println("Total price of stock: " + stck.sumStock());
// Try to insert third item to stock:
Item it3 = new Item("New item","",0.0,0,0);
stck.addItem(it3);
// Change quantity of cheese:
stck.setItemQuantity("Cheese", 200);
// Change quantity of item that does not exist:
stck.setItemQuantity("Bread", 1000);
System.out.println("Now total price of stock is "+stck.sumStock());
}
 
}
</source>
 
====הפעלת אובייקטים====
המחלקה Grocery מעוניינת בשימוש באובייקט מלאי. לשם כך, נוצר אובייקט מטיפוס Stock בעזרת הבנאי הנתון של Stock, ואז ניתן היה לבצע על האובייקט החדש שיצרנו פעולות שונות. המחלקה Stock מקבלת אובייקטים מטיפוס Item כאשר נוספים מוצרים למלאי, אך הם לא נוצרים אצלה, אלא מתקבלים כארגומנט. עם זאת, הם אינם מתקבלים יש מאין - הם חייבים להיווצר במקום כלשהו. בתוכנית שלנו, יצירת האובייקטים האלה, מטיפוס Item, התבצעה בעזרת הבנאי שלהם בתוך המחלקה Grocery. כשרצינו לבצע פעולות על האובייקטים, פנינו אליהם כמו שכבר תואר. למשל, כדי לבצעלהוסיף אתמוצר השיטהלמלאי, שמדפיסההשתמשנו מוצרבשיטה עלaddItem האובייקט _item1, השתמשנובדרך בשורההבאה:
ראשית, יצרנו אובייקט מוצר אחד בעזרת השורה
{{קוד|<nowiki>Item it1 = new Item("Cheese","Smelly green cheese", 1.5);</nowiki>}}
שורה זו פנתה לבנאי של המחלקה Item. לאחר מכן, הוספנו מוצר זה למלאי בעזרת הפקודה
{{קוד|<nowiki>stck.addItem(it1, 2, 7);</nowiki>}}
באופן דומה, במחלקה Stock, כדי לבצע את השיטה שמדפיסה מוצר על האובייקט _item1, השתמשנו בשורה
{{קוד|_<nowiki>item1.printItem();</nowiki>}}
הפעולה התבצעה על האובייקט המסויים _item1, והשתמשה בנתונים שלו. פעולה זהה על האובייקט _item1 ועל האובייקט _item2 לא תיתן תוצאה זהה, כי הנתונים של אובייקט _item1 שונים (בדרך כלל) מאלה של _item2.
 
===הסבר===
ראינו כאן דוגמה, פשוטה יחסית, לתוכנית שנכתבה בצורה מונחית עצמים. המבנה שלנו מתחלק לשלושה חלקים נפרדים: המלאי, המוצרים, והמחלקה שמשתמשת במלאי. התוכנית הזו מדגימה את עיקרון המודולריות של התכנות מונחה העצמים: למרות קשרי הגומלין שמתקיימים בין המחלקות השונות, ניתן לשנות בקלות מחלקה אחת בלי להפריע לפעולת שאר המחלקות. נניח, לדוגמה, כי החלטנו לשנות את הצורה בה מודפסים פרטי כל מוצר. כל שצריך לעשות הוא לשנות את הקוד במקום אחד - בשיטה האחראית על הדפסת מוצר - והצורה בה מודפסים מוצרים תשתנה בכל מקום בתוכנית, בלי שנצטרך לשנות דבר נוסף. נניח כי נרצה לשנות את הצורה בה המלאי מחזיק את המוצרים ברשותו, למשל - לעבור לייצג את המוצרים בעזרת מערך - זה ידרוש עבודה רבה למדי בשיטות של המחלקה Stock, אבל המחלקה Item תוכל להישאר בדיוק כמו שהיא, וגם הלקוח הסופי שמשתמש במחלקה לא צריך לשנות דבר. עם זאת, המימוש הנוכחי רחוק מלהיות מושלם. נראה בהמשך כיצד ניתן לשפרו.
 
{{תכנות מתקדם ב-Java|מוגבל=כן}}
957

עריכות