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

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

جزء من قسم Object Oriented Programming في رحلة Java على Coddy — الدرس 83 من 87.

challenge icon

التحدي

سهل

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

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

  • Book.java: فئة الكتاب الخاصة بك مع isbn، و title، و author، و isAvailable، و borrowedBy، وجميع الأساليب المرتبطة بها بما في ذلك getDetails().
  • User.java: فئة المستخدم الخاصة بك مع id، و name، وقائمة borrowedBooks، وأساليب استعارة/إرجاع الكتب.
  • LibraryException.java: فئة الاستثناء المخصصة الأساسية الخاصة بك.
  • BookNotAvailableException.java: الاستثناء الخاص بك للكتب غير المتاحة.
  • LibraryAdmin.java: واجهة المسؤول الخاصة بك وتنفيذ AdminService.
  • Library.java: فئة المكتبة الكاملة الخاصة بك مع جميع الأساليب — إضافة/إزالة الكتب، تسجيل المستخدمين، الاستعارة/الإرجاع، البحث، ومعالجة الاستثناءات.
  • 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: طباعة الحالة النهائية
        // --- الحالة النهائية ---
        // الكتب: [count]
        // المستخدمون: [count]
        // لكل مستخدم: [name]: [borrowedCount] كتاب (أو كتب)
        System.out.println("Operations completed");
    }
}

جميع دروس Object Oriented Programming