Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

واجهة المسؤول

جزء من قسم البرمجة كائنية التوجه في رحلة Java على Coddy. الدرس 81 من 87.

challenge icon

التحدي

سهل

لنوسّع نظام إدارة المكتبة الخاص بك بإضافة واجهة للمسؤول! تحتاج المكتبة الحقيقية إلى إمكانات إدارية: إضافة كتب جديدة إلى المجموعة، وإزالة الكتب القديمة، وتسجيل أعضاء جدد. ستنشئ واجهة تحدد هذه العمليات الإدارية وتنفذها في فئة مخصصة للمسؤول.

ستواصل البناء على التعليمات البرمجية الموجودة لديك عبر خمسة ملفات:

  • Book.java: احتفظ بفئة Book الخاصة بك مع جميع الوظائف الحالية: isbn وtitle وauthor وisAvailable وborrowedBy وgetDetails()، بالإضافة إلى getters/setters المناسبة.
  • User.java: احتفظ بفئة User الخاصة بك دون تغيير، مع id وname وborrowedBooks من نوع ArrayList، و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 (يتم تمريره من خلال constructor الخاص بها)، وأن تنفذ الأساليب الثلاثة جميعها من خلال تفويضها إلى Library مع إضافة رسائل مناسبة. عند إضافة كتاب، أنشئ Book جديدًا وأضفه إلى المكتبة. وعند تسجيل مستخدم، أنشئ User جديدًا وسجّله.

  • Main.java: اعرض نظام المسؤول الخاص بك! ستتلقى سلسلة من أوامر المسؤول في صورة سلسلة واحدة مفصولة بفواصل. يتبع كل أمر أحد التنسيقات التالية:
    • ADD_BOOK:isbn:title:author
    • REMOVE_BOOK:isbn
    • REGISTER_USER:id:name
    • BORROW: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);
            }
        }
        
        // Print library status
        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);
        }
    }
}

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم Java عبر الإنترنت