ממשק מנהל
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Java של Coddy. שיעור 81 מתוך 87.
אתגר
קלבואו נרחיב את מערכת ניהול הספרייה שלך עם ממשק ניהול! ספרייה אמיתית זקוקה ליכולות ניהוליות: הוספת ספרים חדשים לאוסף, הסרת ספרים שהתיישנו ורישום חברים חדשים. תיצור ממשק שמגדיר את הפעולות הניהוליות האלה ותממש אותן במחלקת ניהול ייעודית.
תמשיך לבנות על הקוד הקיים שלך בחמישה קבצים:
Book.java: השאר את מחלקת Book עם כל הפונקציונליות הקיימת: isbn, title, author, isAvailable, borrowedBy, getDetails() ואת המתודות המתאימות לקבלת ערכים ולעדכון שלהם.User.java: השאר את מחלקת User ללא שינוי, עם id, name, מערך ה־ArrayList של borrowedBooks, המתודות borrowBook(), returnBook(), getBorrowedCount() ו־toString().Library.java: השאר את מחלקת Library עם כל המתודות הקיימות. הוסף מתודה חדשהremoveBook(String isbn)שמאתרת ספר באוסף ומסירה אותו לפי ה־ISBN שלו. המתודה צריכה להחזירtrueאם הספר נמצא והוסר, ו־falseאחרת. אפשר להסיר ספר רק אם הוא זמין כעת (לא מושאל).LibraryAdmin.java: צור ממשק בשםLibraryAdminשמגדיר את החוזה לפעולות ניהוליות. הממשק שלך צריך להצהיר על שלוש מתודות:addBook(String isbn, String title, String author)- מחזירה ערך בוליאני המציין הצלחהremoveBook(String isbn)- מחזירה ערך בוליאני המציין הצלחהregisterUser(String id, String name)- מחזירה ערך בוליאני המציין הצלחה
לאחר מכן, צור מחלקה בשם
AdminServiceשמממשת את הממשק הזה. על AdminService להחזיק הפניה ל־Library (שתועבר דרך הבנאי שלו) ולממש את כל שלוש המתודות באמצעות העברת הפעולות ל־Library, תוך הוספת משוב מתאים. בעת הוספת ספר, צור Book חדש והוסף אותו לספרייה. בעת רישום משתמש, צור User חדש ורשום אותו.Main.java: הדגם את מערכת הניהול שלך! תקבל סדרה של פקודות ניהול כמחרוזת אחת המופרדת בפסיקים. כל פקודה תהיה באחד מהפורמטים הבאים:ADD_BOOK:isbn:title:authorREMOVE_BOOK:isbnREGISTER_USER:id:nameBORROW:userId:isbn
צור Library ו־AdminService. עבד כל פקודה והדפס את התוצאה:
- עבור ADD_BOOK: הדפס
Added: [title]במקרה של הצלחה - עבור REMOVE_BOOK: הדפס
Removed: [isbn]במקרה של הצלחה, אוCannot remove: [isbn]אם הספר לא קיים או מושאל - עבור REGISTER_USER: הדפס
Registered: [name] - עבור BORROW: השתמש בפונקציונליות הקיימת של השאלת ספרים בספרייה
לאחר עיבוד כל הפקודות, הדפס
Library status:ולאחריו את הפרטים של כל ספר ואת מצב הזמינות שלו בפורמט[details] - [Available/Borrowed].
תקבל קלט אחד: מחרוזת פקודות המופרדת בפסיקים.
לדוגמה, עבור הקלט REGISTER_USER:U001:Alice,ADD_BOOK:ISBN-001:Clean Code:Robert Martin,ADD_BOOK:ISBN-002:Design Patterns:Gang of Four,BORROW:U001:ISBN-001,REMOVE_BOOK:ISBN-001,REMOVE_BOOK:ISBN-002, הפלט שלך יהיה:
Registered: Alice
Added: Clean Code
Added: Design Patterns
Alice borrowed Clean Code
Cannot remove: ISBN-001
Removed: ISBN-002
Library status:
[ISBN-001] Clean Code by Robert Martin - Borrowedשים לב איך ממשק הניהול מספק חוזה ברור לפעולות הניהוליות, בעוד שהמימוש של AdminService מטפל בלוגיקה בפועל. המערכת מונעת כראוי הסרה של ספר מושאל, ובו בזמן מאפשרת להסיר ספרים זמינים. ההפרדה בין ממשק למימוש היא עיקרון מרכזי של OOP, שהופך את הקוד שלך לתחזוקה ולבדיקה בקלות רבה יותר!
נסו בעצמכם
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];
library.borrowBook(userId, isbn);
}
}
// הדפס את מצב הספרייה
System.out.println("Library status:");
ArrayList<Book> allBooks = library.getAllBooks();
for (Book book : allBooks) {
String status = book.isAvailable() ? "Available" : "Borrowed";
System.out.println(book.getDetails() + " - " + status);
}
}
}
כל השיעורים ביחידה תכנות מונחה עצמים
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 אונליין