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

نظام الاستعارة

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

challenge icon

التحدي

سهل

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

ستنظّم شيفرتك عبر أربعة ملفات:

  • Book.java: احتفظ بفئة Book من التحدي السابق بكل وظائفها: isbn وtitle وauthor وisAvailable وborrowedBy وgetDetails()، بالإضافة إلى دوال getter/setter المناسبة.
  • 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) - تبحث في الكتب وتُرجع Book المطابق لـ ISBN، أو null إذا لم يتم العثور عليه.

    findUserById(String id) - تبحث في المستخدمين وتُرجع User المطابق للمعرّف 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 والعنوان وauthor، ولمستخدم واحد يتضمن ID والاسم، ثم سلسلة من العمليات.

    أنشئ Library، وأضف الكتابين، وسجّل المستخدم. ثم عالج العمليات: ستتلقى سلسلة مفصولة بفواصل، حيث تكون صيغة كل عملية borrow:userId:isbn أو return:userId:isbn.

    بعد معالجة جميع العمليات، اطبع ملخصًا يعرض حالة كل كتاب بالصيغة [isbn]: [Available/Borrowed].

ستتلقى المدخلات بهذا الترتيب: ISBN الخاص بـ book1، وعنوان book1، وauthor الخاص بـ book1، ثم ISBN الخاص بـ book2، وعنوان book2، وauthor الخاص بـ 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]"
    }
}

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

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