מערכת השאלת ספרים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Java של Coddy. שיעור 79 מתוך 87.
אתגר
קלנמשיך לבנות את מערכת ניהול הספרייה על ידי יצירת מערכת השאלה מסודרת עם מחלקת Library שמנהלת את אוסף הספרים והמשתמשים. כאן המערכת שלך מתחילה להרגיש כמו ספרייה אמיתית: מעקב אחר מי מחזיק במה ואכיפת כללי ההשאלה!
תארגן את הקוד שלך בארבעה קבצים:
Book.java: שמור את המחלקה Book מהאתגר הקודם, עם כל הפונקציונליות שלה: isbn, title, author, isAvailable, borrowedBy, getDetails(), והפעולות המתאימות לקבלת ערכים ולעדכונם.User.java: שמור את המחלקה User עם id, name, מערך ה־ArrayList בשם borrowedBooks, והפעולות borrowBook(), returnBook(), getBorrowedCount() ו־toString().Library.java: צור את המחלקה המרכזיתLibraryשמנהלת את הכול. הספרייה שלך צריכה לנהל שני מערכי ArrayList: אחד לאובייקטים מסוגBookואחד לאובייקטים מסוגUser. כלול את הפעולות האלה:addBook(Book book)- מוסיפה ספר לאוסף הספרייה.registerUser(User user)- מוסיפה משתמש לרשימת המשתמשים הרשומים בספרייה.findBookByIsbn(String isbn)- מחפשת בין הספרים ומחזירה את הספר עם מספר ה־ISBN התואם, אוnullאם לא נמצא.findUserById(String id)- מחפשת בין המשתמשים ומחזירה את המשתמש עם המזהה התואם, אוnullאם לא נמצא.borrowBook(String userId, String isbn)- מוצאת את המשתמש ואת הספר, ואז, אם שניהם קיימים והספר זמין, גורמת למשתמש לשאול את הספר ומדפיסה[userName] borrowed [bookTitle]. אם הספר אינו זמין, יש להדפיסBook not available. אם המשתמש או הספר לא נמצאו, יש להדפיסInvalid user or book.returnBook(String userId, String isbn)- מוצאת את המשתמש ואת הספר, ואז גורמת למשתמש להחזיר את הספר ומדפיסה[userName] returned [bookTitle]. אם המשתמש או הספר לא נמצאו, יש להדפיסInvalid user or book.Main.java: חבר את מערכת הספרייה שלך! תקבל קלט עבור שני ספרים (ISBN, כותרת ומחבר של כל אחד), משתמש אחד (מזהה ושם), ולאחר מכן סדרה של פעולות.צור Library, הוסף את שני הספרים ורשום את המשתמש. לאחר מכן עבד את הפעולות: תקבל מחרוזת מופרדת בפסיקים, שבה כל פעולה מופיעה בפורמט
borrow:userId:isbnאוreturn:userId:isbn.לאחר עיבוד כל הפעולות, הדפס סיכום המציג את הסטטוס של כל ספר בפורמט
[isbn]: [Available/Borrowed].
הקלט יתקבל בסדר הבא: ISBN של book1, הכותרת של book1, המחבר של book1, ISBN של book2, הכותרת של book2, המחבר של book2, מזהה המשתמש, שם המשתמש ולבסוף מחרוזת הפעולות.
לדוגמה, עם הקלט ISBN-001, Clean Code, Robert Martin, ISBN-002, Design Patterns, Gang of Four, U001, Alice ו־borrow:U001:ISBN-001,borrow:U001:ISBN-002,return:U001:ISBN-001, הפלט יהיה:
Alice borrowed Clean Code
Alice borrowed Design Patterns
Alice returned Clean Code
ISBN-001: Available
ISBN-002: Borrowedהאתגר הזה משלב הרכבה, כימוס ועיצוב פעולות כדי ליצור מערכת מגובשת. המחלקה Library פועלת כמתאמת, מאצילה את לוגיקת ההשאלה בפועל למחלקות User ו־Book, ובמקביל מנהלת את האוסף כולו!
נסו בעצמכם
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// קרא את פרטי ספר 1
String isbn1 = scanner.nextLine();
String title1 = scanner.nextLine();
String author1 = scanner.nextLine();
// קרא את פרטי ספר 2
String isbn2 = scanner.nextLine();
String title2 = scanner.nextLine();
String author2 = scanner.nextLine();
// קרא את פרטי המשתמש
String userId = scanner.nextLine();
String userName = scanner.nextLine();
// קרא את מחרוזת הפעולות (מופרדת בפסיקים, בפורמט: borrow:userId:isbn או return:userId:isbn)
String operationsStr = scanner.nextLine();
// TODO: צור אובייקטים מסוג Book עבור book1 ו־book2
// TODO: צור אובייקט מסוג User
// TODO: צור אובייקט מסוג Library, הוסף את שני הספרים ורשום את המשתמש
// TODO: פצל את operationsStr לפי "," ועבד כל פעולה
// לכל פעולה, פצל לפי ":" כדי לקבל את action, userId, isbn
// קרא ל־library.borrowBook() או ל־library.returnBook() בהתאם
// TODO: הדפס סיכום לכל ספר בפורמט "[isbn]: [Available/Borrowed]"
}
}כל השיעורים ביחידה תכנות מונחה עצמים
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 אונליין