בדיקות ושילוב
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Java של Coddy. שיעור 83 מתוך 87.
אתגר
קלברכות על בניית מערכת ניהול הספרייה שלך! הגיע הזמן לחבר הכול יחד ולוודא שכל הרכיבים פועלים כראוי כמערכת משולבת. תיצור תרחיש בדיקה מקיף שיבחן את כל התכונות שבנית לאורך הפרויקט הזה.
תעבוד עם כל שבעת הקבצים מהמערכת שהשלמת:
Book.java: מחלקת Book שלך עם isbn, title, author, isAvailable, borrowedBy, וכל השיטות הקשורות, כוללgetDetails().User.java: מחלקת User שלך עם id, name, רשימת borrowedBooks, ושיטות להשאלה ולהחזרה של ספרים.LibraryException.java: מחלקת החריגה המותאמת האישית הבסיסית שלך.BookNotAvailableException.java: החריגה שלך עבור ספרים שאינם זמינים.LibraryAdmin.java: ממשק הניהול שלך והמימוש של AdminService.Library.java: מחלקת Library המלאה שלך עם כל השיטות: הוספה והסרה של ספרים, רישום משתמשים, השאלה והחזרה, חיפוש וטיפול בחריגות.Main.java: בדיקת האינטגרציה שלך שתדגים כיצד המערכת כולה פועלת יחד.
במחלקת Main שלך, תעבד סדרת פקודות שבודקות כל תכונה מרכזית של מערכת הספרייה שלך. הפקודות מגיעות כמחרוזת אחת, המופרדת בפסיקים, בפורמטים הבאים:
ADD_BOOK:isbn:title:author- הוסף ספר באמצעות AdminServiceREGISTER_USER:id:name- רשום משתמש באמצעות AdminServiceBORROW:userId:isbn- השאל ספר (עם טיפול בחריגות)RETURN:userId:isbn- החזר ספרSEARCH_TITLE:keyword- חפש ספרים לפי כותרתSEARCH_AUTHOR:keyword- חפש ספרים לפי מחברREMOVE_BOOK:isbn- הסר ספר באמצעות AdminService
עבד כל פקודה והדפס את הפלט המתאים:
- ADD_BOOK:
Added: [title] - REGISTER_USER:
Registered: [name] - BORROW: הדפס את הודעת ההצלחה או
Error: [exception message] - RETURN:
[userName] returned [bookTitle] - SEARCH_TITLE: הדפס
Search '[keyword]':ולאחריו את הפרטים של כל ספר תואם, אוNo results - SEARCH_AUTHOR: אותו פורמט כמו בחיפוש לפי כותרת
- REMOVE_BOOK:
Removed: [isbn]אוCannot remove: [isbn]
לאחר כל הפקודות, הדפס סיכום סופי:
--- Final Status ---Books: [count]Users: [count]- עבור כל משתמש, הדפס
[name]: [borrowedCount] book(s)
תקבל קלט אחד: מחרוזת הפקודות המופרדת בפסיקים.
לדוגמה, עבור הקלט ADD_BOOK:ISBN-001:Clean Code:Robert Martin,ADD_BOOK:ISBN-002:Effective Java:Joshua Bloch,REGISTER_USER:U001:Alice,REGISTER_USER:U002:Bob,BORROW:U001:ISBN-001,BORROW:U002:ISBN-001,SEARCH_TITLE:java,RETURN:U001:ISBN-001,REMOVE_BOOK:ISBN-001, הפלט שלך יהיה:
Added: Clean Code
Added: Effective Java
Registered: Alice
Registered: Bob
Alice borrowed Clean Code
Error: Book not available: ISBN-001
Search 'java':
[ISBN-002] Effective Java by Joshua Bloch
Alice returned Clean Code
Removed: ISBN-001
--- Final Status ---
Books: 1
Users: 2
Alice: 0 book(s)
Bob: 0 book(s)האתגר הסופי הזה מוודא שכל הרכיבים, המחלקות, הממשקים, החריגות והלוגיקה של הספרייה שלך פועלים יחד בצורה חלקה. בנית מערכת ניהול ספרייה מלאה וחסינה!
נסו בעצמכם
import java.util.Scanner;
import java.util.ArrayList;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// קרא את הפקודות המופרדות בפסיקים
String input = scanner.nextLine();
String[] commands = input.split(",");
// צור את Library ואת AdminService
Library library = new Library();
AdminService adminService = new AdminService(library);
// עבד כל פקודה
for (String command : commands) {
String[] parts = command.split(":");
String operation = parts[0];
if (operation.equals("ADD_BOOK")) {
String isbn = parts[1];
String title = parts[2];
String author = parts[3];
if (adminService.addBook(isbn, title, author)) {
System.out.println("Added: " + title);
}
} else if (operation.equals("REMOVE_BOOK")) {
String isbn = parts[1];
if (adminService.removeBook(isbn)) {
System.out.println("Removed: " + isbn);
} else {
System.out.println("Cannot remove: " + isbn);
}
} else if (operation.equals("REGISTER_USER")) {
String id = parts[1];
String name = parts[2];
if (adminService.registerUser(id, name)) {
System.out.println("Registered: " + name);
}
} else if (operation.equals("BORROW")) {
String userId = parts[1];
String isbn = parts[2];
try {
String result = library.borrowBook(userId, isbn);
System.out.println(result);
} catch (LibraryException e) {
System.out.println("Error: " + e.getMessage());
}
}
// TODO: הוסף טיפול בפקודה RETURN
// TODO: הוסף טיפול בפקודה SEARCH_TITLE
// TODO: הוסף טיפול בפקודה SEARCH_AUTHOR
}
// TODO: הדפס את המצב הסופי
// --- Final Status ---
// ספרים: [count]
// משתמשים: [count]
// לכל משתמש: [name]: [borrowedCount] ספרים
System.out.println("Operations completed");
}
}
כל השיעורים ביחידה תכנות מונחה עצמים
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 אונליין