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

الاختبار والدمج

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

challenge icon

التحدي

سهل

تهانينا على بناء نظام إدارة المكتبة! حان الوقت لجمع كل شيء معًا والتحقق من أن جميع المكونات تعمل بشكل صحيح كنظام متكامل. ستنشئ سيناريو اختبار شاملًا يستخدم جميع الميزات التي بنيتها طوال هذا المشروع.

ستعمل مع جميع الملفات السبعة من نظامك المكتمل:

  • 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 - إضافة كتاب عبر AdminService
  • REGISTER_USER:id:name - تسجيل مستخدم عبر AdminService
  • BORROW: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");
    }
}

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

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