מחלקות ספר ולקוח
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Java של Coddy. שיעור 78 מתוך 87.
אתגר
קלנמשיך לבנות את מערכת ניהול הספרייה על ידי הרחבת המחלקות Book ו־User מהשיעור הקודם. עכשיו נוסיף למשתמשים אפשרות לשאול ספרים, וכך ניצור קשר ממשי בין שתי הישויות האלה.
תארגנו את הקוד בשלושה קבצים:
Book.java: שפרו את המחלקה Book מהאתגר הקודם. שמרו על כל הפונקציונליות הקיימת (isbn, title, author, isAvailable עם getters/setters, ו־getDetails()). כעת הוסיפו שדה פרטיborrowedByמסוגString, ששומר את המזהה של המשתמש ששאל את הספר (אוnullאם הספר לא נשאל). הוסיפו getter עבורborrowedByו־setter שמעדכן גם אתisAvailableבהתאם: כאשר ספר נשאל (הערך של borrowedBy מוגדר לערך שאינו null), הוא הופך ללא זמין; כאשר הספר מוחזר (מוגדר ל־null), הוא הופך שוב לזמין.User.java: הרחיבו את המחלקה User כדי לעקוב אחר ספרים שנשאלו. שמרו על השדות id ו־name, הבנאי, ה־getters ו־toString()הקיימים. הוסיפו שדה פרטיArrayList<Book>בשםborrowedBooks(אתחלו אותו בבנאי). צרו מתודהborrowBook(Book book)שמוסיפה את הספר לרשימה של המשתמש ומגדירה אתborrowedByשל הספר למזהה של המשתמש הזה. צרו מתודהreturnBook(Book book)שמסירה את הספר מהרשימה ומגדירה אתborrowedByל־null. הוסיפו מתודהgetBorrowedCount()שמחזירה כמה ספרים יש למשתמש כרגע.Main.java: הדגימו את מערכת השאלת הספרים בפעולה. תקבלו חמישה קלטים: ISBN, כותרת ומחבר של ספר, ולאחר מכן מזהה משתמש ושם.צרו אובייקט Book ואובייקט User באמצעות הקלטים האלה. הדפיסו את פרטי הספר ואת סטטוס הזמינות שלו. לאחר מכן, תנו למשתמש לשאול את הספר. הדפיסו שוב את זמינות הספר, ואחריה את זהות המשתמש ששאל אותו, בפורמט
Borrowed by: [userId]. הדפיסו כמה ספרים יש למשתמש בפורמט[name] has [count] book(s). לבסוף, תנו למשתמש להחזיר את הספר והדפיסו פעם נוספת את סטטוס הזמינות.
תקבלו חמישה קלטים לפי הסדר: ISBN (String), כותרת (String), מחבר (String), מזהה משתמש (String) ושם משתמש (String).
לדוגמה, עם הקלטים 978-0-13-468599-1, Effective Java, Joshua Bloch, U001 ו־Alice, הפלט יהיה:
[978-0-13-468599-1] Effective Java by Joshua Bloch
Available: true
Available: false
Borrowed by: U001
Alice has 1 book(s)
Available: trueהאתגר הזה מתבסס ישירות על העבודה הקודמת שלכם ומוסיף את הקשר החשוב בין ספרים למשתמשים, שהופך מערכת ספרייה לשימושית. תשתמשו בהרכבה (User "has" Books) ותראו כיצד שינויים באובייקט אחד יכולים להשפיע על אובייקט אחר באמצעות מתודות שתוכננו היטב!
נסו בעצמכם
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// קרא את פרטי הספר
String isbn = scanner.nextLine();
String title = scanner.nextLine();
String author = scanner.nextLine();
// קרא את פרטי המשתמש
String userId = scanner.nextLine();
String userName = scanner.nextLine();
// צור אובייקט Book עם isbn, title ו-author
Book book = new Book(isbn, title, author);
// צור אובייקט User עם userId ו-userName
User user = new User(userId, userName);
// הדפס את פרטי הספר באמצעות getDetails()
System.out.println(book.getDetails());
// הדפס אם הספר זמין (פורמט: "Available: true" או "Available: false")
System.out.println("Available: " + book.isAvailable());
// בקש מהמשתמש לשאול את הספר
user.borrowBook(book);
// הדפס שוב אם הספר זמין
System.out.println("Available: " + book.isAvailable());
// הדפס מי שאל אותו
System.out.println("Borrowed by: " + book.getBorrowedBy());
// הדפס כמה ספרים יש למשתמש
System.out.println(user.getName() + " has " + user.getBorrowedCount() + " book(s)");
// בקש מהמשתמש להחזיר את הספר
user.returnBook(book);
// הדפס שוב אם הספר זמין
System.out.println("Available: " + book.isAvailable());
}
}כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים
קבצים חיצונייםמבוא לתכנות מונחה עצמיםמחלקות לעומת אובייקטיםמילת המפתח thisמתודותשדות (מאפיינים)מתודת הבנאיהעמסת בנאיםחזרה – מחשבון פשוט4ירושה
ירושה בסיסית (extends)מילת המפתח superדריסת מתודות (@Override)שרשור בנאיםהמחלקה Objectירושה יחידה ורב־רמתיתלמה אין ירושה מרובה של מחלקותסיכום – היררכיית עובדים7מתודות מיוחדות ומחלקת Object
מתודת toString()equals() ו-hashCode()מתודת clone()compareTo() ו-Comparableהממשק Comparatorסיכום – מיון מותאם אישית10טיפול בחריגות ב-OOP
היררכיית מחלקות החריגותחריגות מותאמות אישיתשגיאות Checked לעומת Uncheckedתבנית Try With Resourcesחזרה – משתמש מאומת13פרויקט: ניהול ספרייה
סקירת הפרויקט ותכנון UMLמחלקות ספר ולקוחמערכת השאלת ספריםפונקציונליות חיפושממשק מנהלשילוב טיפול בחריגותבדיקות ושילוב2מצייני גישה ואנקפסולציה
סקירה של רמות הגישהמתודות Getter ו-Setterהסתרת מידעמילת המפתח finalסיכום – מנהל חשבון בנק5פולימורפיזם
יסודות העמסת מתודותדריסת מתודות (בזמן ריצה)המרה כלפי מעלה וכלפי מטההאופרטור instanceofמחלקות ומתודות מופשטותסיכום – מחשבון צורות8מושגי OOP מתקדמים
הרכבה מול ירושהאגרגציה מול הרכבהמחלקות פנימיות, מקוננות ואנונימיותEnums ומתודות של EnumRecords (Java 16+)מחלקות חתומות (Java 17+)3מאפייני מחלקה וחברים סטטיים
משתני מופע לעומת משתנים סטטייםמתודות סטטיותבלוקים סטטייםקבועים (static final)סיכום — מונה ומחלקת עזר6ממשקים ומחלקות מופשטות
מבוא לממשקיםמימוש ממשקיםמימוש של כמה ממשקיםמתודות ברירת מחדל וסטטיות בממשקמחלקות מופשטות לעומת ממשקיםממשקים פונקציונלייםסיכום – מערכת תשלומיםתרגלו בעצמכם: קומפיילר Java אונליין